Запуск сценария bash при запуске контейнера Docker не работает

Последние пару часов я пытался запустить свой скрипт startup.sh при запуске контейнера докеров, но по какой-то причине он не работает.

Мой Dockerfile для создания образа:

FROM armv7/armhf-ubuntu:latest
MAINTAINER Mohammed Noureldin <[email protected]>
RUN apt update && apt upgrade -y && apt install -y mumble-server
ADD scripts/startup.sh /startup.sh

Мой сценарий запуска:

#!/bin/bash
/etc/init.d/mumble-server start

Здесь ничего не происходит, хотя я пытался создать файл внутри скрипта, но тоже ничего не получилось!

Я попытался выполнить скрипт прямо из командной строки, но он не работает, не знаю почему:

команда запуска докера:

docker run --name murmur -itd --restart always --network bridge -p 64738:64738 -v /var/lib/mumble-server/ -v /etc/ mnoureldin/murmur:latest /bin/bash -c "bash /startup.sh;/bin/bash"

И вот что я получаю при попытке выполнить скрипт вручную:

43b9d8dd4116bc605537c7af35ab186ca165ea6e957fab5908d39b2f085edf41
mohammed@server01:~/Dockerfiles/Mumble $ docker attach murmur
root@43b9d8dd4116:/# bash
.dockerenv  boot/       etc/        lib/        mnt/        proc/       run/        srv/        sys/        usr/
bin/        dev/        home/       media/      opt/        root/       sbin/       startup.sh  tmp/        var/
root@43b9d8dd4116:/# bash startup.sh
Usage: /etc/init.d/mumble-server {start|stop|restart|force-reload}

Или когда у меня есть пустая строка между двумя строками скрипта, я получаю эту ошибку:

root@830193e67fd7:/# bash startup.sh
startup.sh: line 2: $'\r': command not found
Usage: /etc/init.d/mumble-server {start|stop|restart|force-reload}

Может ли кто-нибудь объяснить, что такое хеппенинг и почему он не работает?


person Mohammed Noureldin    schedule 01.11.2016    source источник
comment
Ошибка \r означает, что ваш сценарий оболочки использует разрывы строк Windows (CRLF или \r\n), что сбивает с толку Bash. Убедитесь, что вы преобразовали свой сценарий в разрывы строк Unix/Linux (LF или просто \n), чтобы избавиться от этой ошибки. Ваш текстовый редактор должен иметь возможность конвертировать файл для использования LF вместо CRLF...   -  person nwinkler    schedule 01.11.2016
comment
@nwinkler Это во втором случае, но как быть, когда у меня нет пробелов? во всяком случае, я пытаюсь преобразовать это, как вы сказали   -  person Mohammed Noureldin    schedule 01.11.2016
comment
Попробуйте файл с LF вместо CRLF, это также может решить первоначальную проблему.   -  person nwinkler    schedule 01.11.2016
comment
@nwinkler Это действительно так! Спасибо! Не могли бы вы опубликовать это как ответ? было бы здорово, если бы вы сказали мне, как исправить это прямо в Windows (я использую notepad++), но я не знал, как это исправить, поэтому просто переписал файл в vim в linux. большое спасибо   -  person Mohammed Noureldin    schedule 01.11.2016
comment
Спасибо - добавил ответ на этот вопрос, а также ссылку на вопрос о том, как это сделать в Notepad++.   -  person nwinkler    schedule 01.11.2016


Ответы (1)


Ошибка вызвана окончаниями строк в вашем сценарии оболочки. Похоже, вы используете окончания строк Windows (CRLF или \r\n), где неожиданное r сбивает с толку Bash. Bash ожидает только LF или \n, отсюда и сообщение об ошибке.

Большинство текстовых редакторов для программистов имеют некоторую поддержку для внесения этих изменений. Notepad ++ имеет «Редактировать> Преобразование EOL> Формат Unix/OSX». Дополнительные сведения см. в разделе преобразование EOL в блокноте ++.

person nwinkler    schedule 01.11.2016