Команда 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
  1. Беги без всякого флага

    docker run hello-docker
    

    Это напечатает 'Hello -d ocker' на моей консоли и выйдет

  2. Запуск с флагами -itd

    docker run -itd hello-docker
    

    и, как показано ниже, вывод моей консоли, на этот раз также скоро выйдет. :( enter image description here

    • Разница, которую я увидел, в разделе КОМАНДА, когда я запускаю командный раздел с другими изображениями, показывает "/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