Запустить скрипт в Dockerfile

93

Я пытаюсь запустить сценарий во время процесса сборки в моем Dockerfile. Но вроде не работает.

Я пробовал так:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Также так:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

А также выполняю свой работающий контейнер:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Кажется, ничего не работает.

Ты знаешь как это делать?

Кевин
источник
bootstarp.shУстановлен ли исполняемый бит?
jwodder
Как этот RUN chmod + x /bootstarp.sh?
Кевин
2
С "не работает" что именно происходит? Выдает ошибку? Файл присутствует внутри изображения? Если вы docker exec -it symfony bashвнутри контейнера, можете ли вы вручную запустить скрипт и проверить его содержимое? ( cat bootstarp.sh)?
thaJeztah 01
попробуйте это: docker exec symfony /bin/bash /bootstarp.shи дайте мне знать результат.
Boynux 01
12
Ermahgerd bootstarp!
Бруно Броноски

Ответы:

128

RUNи ENTRYPOINTдва разных способа выполнения сценария.

RUNозначает, что он создает промежуточный контейнер, запускает сценарий и фиксирует новое состояние этого контейнера в новом промежуточном образе. После этого сценарий не будет запущен: ваше окончательное изображение должно отражать результат этого сценария.

ENTRYPOINT означает, что ваше изображение (которое еще не выполнило сценарий) создаст контейнер и запустит этот сценарий.

В обоих случаях сценарий необходимо добавить, и RUN chmod +x /bootstrap.shэто хорошая идея.

Он также должен начинаться с шебанга (вроде #!/bin/sh)

Учитывая ваш сценарий ( bootstarp.sh: пара git config --globalкоманд), было бы лучше всего использовать RUNэтот сценарий один раз в вашем Dockerfile, но убедитесь, что вы используете правильного пользователя (глобальный git configфайл %HOME%/.gitconfig, который по умолчанию является /rootединственным)

Добавьте в свой Dockerfile:

RUN /bootstart.sh

Затем при запуске контейнера проверьте содержимое, /root/.gitconfigчтобы убедиться, что сценарий был запущен.

VonC
источник
5
Кроме того, вы могли иметь в виду bootstrap.shвместо bootstarp.sh: см. Stackoverflow.com/a/1254561/6309
VonC
Круто! Очень хорошо работает с RUN /bootstrap.sh
Кевин
1
Шебанг в первой строке сделал это за меня, спасибо! :)
GDICommander
34

В дополнение к ответам выше:

Если вы создали / редактировали файл сценария .sh в Windows, убедитесь, что он был сохранен со строкой, заканчивающейся в формате Unix . По умолчанию многие редакторы в Windows преобразуют окончания строк Unix в формат Windows, а Linux не распознает shebang (#! / Bin / sh) в начале файла. Таким образом, Linux выдаст сообщение об ошибке, например, если нет shebang.

Подсказки:

  • Если вы используете Notepad ++, вам нужно нажать «Edit / EOL Conversion / UNIX (LF)»
  • Если вы используете Visual Studio, я бы предложил установить плагин « End Of Line ». Затем вы можете сделать видимыми окончания строк, нажав Ctrl-R, Ctrl-W. А чтобы установить окончания в стиле Linux, вы можете нажать Ctrl-R, Ctrl-L. Для стиля Windows нажмите Ctrl-R, Ctrl-C.
VeganHunter
источник
4
Вау, ты спас мне день. Спасибо тебе за это.
mw
2
Гениально! это была моя ТОЧНАЯ проблема!
Kevinsyel
1
Мой VSCode автоматически устанавливал концы сценария оболочки на CRLF в окнах. Сборка докера не удалась из-за некоторых случайных символов. Я изменил настройки в VS Code, и он сразу начал работать. Благодарность! Я проголосовал за.
Адитхья Упадхья
24

Попробуйте создать скрипт с ADDкомандой и указанием рабочего каталога. Примерно так («скрипт» - это имя скрипта, и /root/script.shэто то место, где вы хотите его в контейнере, это может быть другой путь:

ADD script.sh /root/script.sh

В этом случае ADDдолжно быть раньше CMD, если у вас есть один BTW, это отличный способ импортировать скрипты в любое место в контейнере с хост-машины.

На CMDместе[./script]

Он должен автоматически выполнить ваш скрипт

Вы также можете указать WORKDIRas /root, тогда вы будете автоматически помещены в корень при запуске контейнера.

Майкл
источник
Как докер сначала определяет, где находится script.sh? Я имею в виду, первый параметрscript.sh
закаты
поскольку вы строите контейнер, вы также отвечаете за размещение путей
Майкл
путь и имя первого параметра относятся script.shкDockerfile
eja
4

Рекомендуется использовать COPYвместо ADDкопирования из локальной файловой системы в изображение. Кроме того, я бы рекомендовал создать подпапку для размещения вашего контента. По крайней мере, он держит все в порядке. Убедитесь, что вы пометили скрипт как исполняемый с помощью chmod.

Здесь я создаю scriptsподпапку, в которую будет помещать мой скрипт и запускать его из:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
Добсон
источник