Инструкция Dockerfile CMD выйдет из контейнера сразу после его запуска
Я хочу настроить некоторую конфигурацию при запуске моего контейнера, для этого я использую сценарии оболочки. Но мой контейнер выйдет, как только мои скрипты закончатся, я попробовал с флагом-d / режим отсоединения, но он никогда не будет работать в режиме отсоединения.
ниже мой Dockerfile
FROM ubuntu:14.04
ADD shell.sh /usr/local/bin/shell.sh
RUN chmod 777 /usr/local/bin/shell.sh
CMD /usr/local/bin/shell.sh
ниже мой скрипт
#!/bin/bash
echo Hello-docker
-
Run без какого-либо флага
docker run hello-docker
это напечатает "Hello-docker" на моей консоли и выходы
-
запуск с флагами-itd
docker run -itd hello-docker
и как ниже моего выхода консоли, на этот раз также скоро выйдет. : (
разница, которую я видел, находится в разделе команды, когда я запускаю другие изображения, раздел команды покажет "/bin/bash" и будет продолжаться в режиме отсоединения.
и когда я запускаю свое изображение в контейнере с командой сценария оболочки, раздел покажет "/bin /sh-c/usr / loca" и выход.
Я хочу запустить контейнер, пока я не остановлю его вручную.
EDIT:
после добавления инструкции ENTRYPOINT в Dockerfile это не будет выполнять мой сценарий оболочки : (
FROM ubuntu:14.04
ADD shell.sh /usr/local/bin/shell.sh
RUN chmod 777 /usr/local/bin/shell.sh
CMD /usr/local/bin/shell.sh
ENTRYPOINT /bin/bash
согласно документации docker здесь
CMD будет переопределен при запуске контейнера с альтернативой аргументы, поэтому, если я запускаю docker image с некоторыми аргументами, как показано ниже, не будет выполнять инструкции CMD. :(
sudo docker run -it --entrypoint=/bin/bash <imagename>
4 ответов
контейнер docker будет работать до тех пор, пока CMD
из вашего Dockerfile берет.
в твоем случае CMD
состоит из сценария оболочки, содержащей одно Эхо. Таким образом, контейнер выйдет после завершения Эхо.
можно переопределить CMD
, например:
sudo docker run -it --entrypoint=/bin/bash <imagename>
это запустит интерактивную оболочку в вашем контейнере вместо выполнения вашего CMD
. Ваш контейнер выйдет, как только вы выйдете из оболочки.
если вы хотите, чтобы ваш контейнер оставался активным, вы должны убедиться, что ваш CMD
продолжает работать. Например, добавив строку while true; do sleep 1; done
к вашему shell.sh файл, ваш контейнер напечатает ваше приветственное сообщение, а затем ничего не сделает, пока вы его не остановите (используя docker stop в другом терминале).
вы можете открыть оболочку в работающем контейнере, используя docker exec -it <containername> bash
. Если вы затем выполните команду ps ax
, он покажет вам, что ваш shell.sh все еще работает внутри контейнера.
наконец, с некоторыми экспериментами я получил свой лучший результат, как показано ниже
нет ничего плохого в моем Dockerfile, как показано ниже, это правильно.
FROM ubuntu:14.04
ADD shell.sh /usr/local/bin/shell.sh
RUN chmod 777 /usr/local/bin/shell.sh
CMD /usr/local/bin/shell.sh
что я делаю, чтобы получить ожидаемый результат, я просто добавляю еще одну команду(/bin/bash) в файл сценария оболочки, как показано ниже, и vola все работает наилучшим образом.
#!/bin/bash
echo “Hello-docker” > /usr/hello.txt
/bin/bash
вы также можете изменить свой первый файл Dockerfile, заменив
CMD /usr/local/bin/shell.sh
by
CMD /usr/local/bin/shell.sh ; sleep infinity
таким образом, ваш скрипт не завершает, а контейнер остается.