Контейнеры - это оболочка для запуска процесса (эта оболочка представляет собой пространства имен и cgroups).Запускаемый процесс определяется линиями ENTRYPOINT и CMD Dockerfile.Вы можете переопределить процесс по умолчанию для образа, который запускается при запуске контейнера, а для значения CMD переопределение включает в себя передачу другой команды после имени образа.
Поэтому, когда ваш Dockerfile заканчивается на:
COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
CMD ["/setup.sh"]
Вы определили значение CMD по умолчанию в своем изображении.Но при запуске:
docker build -t docker-test .; docker run -it docker-test bash
Значение ./setup.sh
CMD заменяется на bash
.Это означает, что setup.sh
никогда не запускается.
Вы можете решить эту проблему несколькими способами.
Вы можете запустить setup.sh
как часть сборки образа.,Если сценарий не зависит от того, как выполняется контейнер (например, внешние тома, передаваемые переменные среды и т. Д.), То это лучший выбор.
Переместите сценарий наточку входа и завершите ее, выполнив команду.Когда вы определяете и точку входа, и cmd, контейнер будет запускать только один процесс, поэтому поведение docker заключается в передаче cmd в качестве аргументов точке входа.Чтобы запустить cmd, вам нужно сделать это как часть сценария точки входа.
Вариант # 1 выглядит как решение, которое вы сделали, и ответ, который я бы порекомендовал:
COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
RUN ["/setup.sh"]
CMD bash
Вы захотите включить оболочку в начало скрипта, чтобы linux знал, как ее запустить:
#!/bin/sh
# The #!/bin/sh above is important, you can also replace that with the path to bash
# get addons path
addons_path=`ls -d /mnt/extra-addons/* | paste -d, -s`
# can't use / because directory name contains, using #
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg
Опция # 2 полезна, если/ mnt / extra-addons / изменяется каждый раз, когда вы запускаете контейнер.Это выглядит так:
COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
ENTRYPOINT ["/setup.sh"]
CMD ["bash"]
С дополнительной строкой, добавленной в скрипт установки:
#!/bin/sh
# get addons path
addons_path=`ls -d /mnt/extra-addons/* | paste -d, -s`
# can't use / because directory name contains, using #
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg
# this next line runs the passed arguments as pid 1, replacing this script
# this is how you run an entrypoint and fall through to a cmd
exec "$@"