Инструкция 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. Run без какого-либо флага

    docker run hello-docker
    

    это напечатает "Hello-docker" на моей консоли и выходы

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

    docker run -itd hello-docker
    

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

    • разница, которую я видел, находится в разделе команды, когда я запускаю другие изображения, раздел команды покажет "/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

таким образом, ваш скрипт не завершает, а контейнер остается.


CMD bash -C '/path/to/start.sh';'bash'