Запустить скрипт в 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чтобы убедиться, что сценарий был запущен.


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.

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.