2017-02-14 14 views
5

Я хочу настроить некоторые настройки при запуске моего контейнера, для этого я использую сценарии оболочки. Но мой контейнер выйдет, как только мои скрипты закончатся, я попытался использовать флаг -d/отсоединенный режим, но он никогда не будет работать в отключенном режиме.Dockerfile Инструкция CMD выйдет из контейнера сразу после запуска

Ниже мой 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-докер' на моя консоль и выходы

  2. Запуск с -itd флагов

    docker run -itd hello-docker 
    

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

    • разница я увидел в COMMAND секции при запуске других изображений команды раздел будет показаны «/ бен/Баш» и будет продолжаться в отдельном режиме.

    • И когда Я бег моего изображения в контейнере с сценарий оболочки COMMAND разделе будет показан «/ bin/ш -c/USR/лок» и Выйти.

    • Я хочу, чтобы запустить контейнер, пока я не остановить его вручную.

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 документации here

CMD будет переопределен при запуске контейнера с альтернативными аргументами, поэтому, если я запустил изображение докеров с некоторыми аргументами, как показано ниже, не будет выполнять инструкции CMD. :(

sudo docker run -it --entrypoint=/bin/bash <imagename> 

ответ

3

Наконец с некоторыми экспериментами я получил свой лучший результат, как показано ниже

Там нет ничего плохого с моей 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/Баш) в моем файле сценария оболочки, как показано ниже, и Вола все работает в моем наилучшим образом.

#!/bin/bash 

echo “Hello-docker” > /usr/hello.txt 

/bin/bash 
4

грузчик контейнер будет работать до тех пор, как CMD от вашего Dockerfile дублей.

В вашем случае ваш CMD состоит из сценария оболочки, содержащий один эхо. Таким образом, контейнер будет выходить после завершения эхо.

Вы можете переопределить CMD, например:

sudo docker run -it --entrypoint=/bin/bash <imagename> 

Это запустит интерактивную оболочку в контейнере вместо выполнения вашего CMD. Ваш контейнер выйдет, как только вы выйдете из этой оболочки.

Если вы хотите, чтобы ваш контейнер оставался активным, вы должны убедиться, что ваш CMD продолжает работать. Например, добавив в файл shell.sh строку while true; do sleep 1; done, ваш контейнер напечатает ваше приветственное сообщение и больше ничего не сделает, пока вы его не прекратите (используя остановку докера в другом терминале).

Вы можете открыть оболочку в работающем контейнере, используя docker exec -it <containername> bash. Если вы затем выполните команду ps ax, она покажет вам, что ваш shell.sh все еще запущен внутри контейнера.

+0

Но это не будет выполнять инструкцию CMD, мой скрипт оболочки не будет выполнен. :( –

+0

Это верно. У вас не может быть и того, и другого. Единственный другой вариант - сохранить ваш 'CMD'. Я добавил пример к моему ответу. – NZD

+0

Но я тоже хочу выполнить свой скрипт, 't хочу выполнить его вручную. Это проблема. –

5

Вы также можете изменить свой первый Dockerfile, заменив

CMD /usr/local/bin/shell.sh

по

CMD /usr/local/bin/shell.sh ; sleep infinity

Таким образом, ваш сценарий не завершается, и ваш контейнер продолжает работать.

+0

Это будет работать, но после этого Если я присоединюсь с контейнером и хочу проверить что-то, что он не будет отвечать. Например, если выполнить команду ls -l ничего не произойдет. –

+0

Вместо attach, вы можете 'docker exec container_id__or_name ls -l' – user2915097

+0

Но все же я чувствую, что вместо этого используется более тестовый способ, а не использование бесконечности сна. –