Команда 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
-
Беги без всякого флага
docker run hello-docker
Это напечатает 'Hello -d ocker' на моей консоли и выйдет
-
Запуск с флагами -itd
docker run -itd hello-docker
и, как показано ниже, вывод моей консоли, на этот раз также скоро выйдет. :(
-
Разница, которую я увидел, в разделе КОМАНДА, когда я запускаю командный раздел с другими изображениями, показывает "/bin/bash" и продолжает работу в автономном режиме.
-
И когда я запусту свой образ в контейнере с командным скриптом, в разделе COMMAND появится "/bin/sh -c/usr/loca" и Exit.
-
Я хочу запустить контейнер, пока я не остановлю его вручную.
РЕДАКТИРОВАТЬ:
После добавления инструкции 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
Согласно документации докера здесь
CMD будет переопределен при запуске контейнера с альтернативными аргументами, поэтому, если я запусту образ Docker с некоторыми аргументами, как показано ниже, не будет выполнять инструкции CMD. :(
sudo docker run -it --entrypoint=/bin/bash <imagename>
Ответы
Ответ 1
Наконец, с некоторыми экспериментами я получил лучший результат, как показано ниже
Нет ничего плохого в моем 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) в свой файл сценария оболочки, как показано ниже, и вола все работает наилучшим образом.
#!/bin/bash
echo "Hello-docker" > /usr/hello.txt
/bin/bash
Ответ 2
Контейнер-докер будет работать до тех пор, пока CMD
из вашего файла Docker.
В вашем случае ваш CMD
состоит из сценария оболочки, содержащего одно эхо. Таким образом, контейнер будет завершен после завершения эха.
Вы можете переопределить CMD
, например:
sudo docker run -it --entrypoint=/bin/bash <imagename>
Это запустит интерактивную оболочку в вашем контейнере вместо выполнения вашего CMD
. Ваш контейнер выйдет, как только вы выйдете из этой оболочки.
Если вы хотите, чтобы ваш контейнер оставался активным, вы должны убедиться, что ваш CMD
продолжает работать. Например, добавив строку в while true; do sleep 1; done
while true; do sleep 1; done
while true; do sleep 1; done
с вашим файлом shell.sh, ваш контейнер напечатает ваше приветственное сообщение, а затем ничего не сделает, пока вы его не прекратите (используя остановку докера в другом терминале).
Вы можете открыть оболочку в запущенном контейнере, используя docker exec -it <containername> bash
. Если вы затем выполните команду ps ax
, она покажет вам, что ваш shell.sh все еще работает внутри контейнера.
Ответ 3
Вы также можете изменить свой первый файл Docker, заменив
CMD/usr/local/bin/shell.sh
от
CMD/usr/local/bin/shell.sh; sleep infinity
Таким образом, ваш сценарий не заканчивается, и ваш контейнер остается включенным.
Ответ 4
CMD bash -C '/path/to/start.sh';'bash'
Ответ 5
При запуске оболочки добавьте строчный код: tail -f/dev/null
или /bin/bash
чтобы убедиться, что вы выполнили оболочку и приостановили процесс в системе, чтобы контейнер tail -f/dev/null
Не забудьте дать "chmod [ CN01] "доступ к start.sh. есть демо:
#!/bin/bash
cp /root/supervisor/${RUN_SERVICE}.ini /etc/supervisor/conf.d/
sleep 1
service supervisor start
/bin/bash