Я пытаюсь запустить сценарий во время процесса сборки в моем 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"
Кажется, ничего не работает.
Ты знаешь как это делать?
docker
dockerfile
Кевин
источник
источник
bootstarp.sh
Установлен ли исполняемый бит?docker exec -it symfony bash
внутри контейнера, можете ли вы вручную запустить скрипт и проверить его содержимое? (cat bootstarp.sh
)?docker exec symfony /bin/bash /bootstarp.sh
и дайте мне знать результат.Ответы:
RUN
иENTRYPOINT
два разных способа выполнения сценария.RUN
означает, что он создает промежуточный контейнер, запускает сценарий и фиксирует новое состояние этого контейнера в новом промежуточном образе. После этого сценарий не будет запущен: ваше окончательное изображение должно отражать результат этого сценария.ENTRYPOINT
означает, что ваше изображение (которое еще не выполнило сценарий) создаст контейнер и запустит этот сценарий.В обоих случаях сценарий необходимо добавить, и
RUN chmod +x /bootstrap.sh
это хорошая идея.Он также должен начинаться с шебанга (вроде
#!/bin/sh
)Учитывая ваш сценарий (
bootstarp.sh
: параgit config --global
команд), было бы лучше всего использоватьRUN
этот сценарий один раз в вашемDockerfile
, но убедитесь, что вы используете правильного пользователя (глобальныйgit config
файл%HOME%/.gitconfig
, который по умолчанию является/root
единственным)Добавьте в свой Dockerfile:
Затем при запуске контейнера проверьте содержимое,
/root/.gitconfig
чтобы убедиться, что сценарий был запущен.источник
bootstrap.sh
вместоbootstarp.sh
: см. Stackoverflow.com/a/1254561/6309В дополнение к ответам выше:
Если вы создали / редактировали файл сценария .sh в Windows, убедитесь, что он был сохранен со строкой, заканчивающейся в формате Unix . По умолчанию многие редакторы в Windows преобразуют окончания строк Unix в формат Windows, а Linux не распознает shebang (#! / Bin / sh) в начале файла. Таким образом, Linux выдаст сообщение об ошибке, например, если нет shebang.
Подсказки:
источник
Попробуйте создать скрипт с
ADD
командой и указанием рабочего каталога. Примерно так («скрипт» - это имя скрипта, и/root/script.sh
это то место, где вы хотите его в контейнере, это может быть другой путь:В этом случае
ADD
должно быть раньшеCMD
, если у вас есть один BTW, это отличный способ импортировать скрипты в любое место в контейнере с хост-машины.На
CMD
месте[./script]
Он должен автоматически выполнить ваш скрипт
Вы также можете указать
WORKDIR
as/root
, тогда вы будете автоматически помещены в корень при запуске контейнера.источник
script.sh
script.sh
кDockerfile
Рекомендуется использовать
COPY
вместоADD
копирования из локальной файловой системы в изображение. Кроме того, я бы рекомендовал создать подпапку для размещения вашего контента. По крайней мере, он держит все в порядке. Убедитесь, что вы пометили скрипт как исполняемый с помощьюchmod
.Здесь я создаю
scripts
подпапку, в которую будет помещать мой скрипт и запускать его из:источник