2015-02-15 3 views
2

Можно ли добавить инструкции, например RUN, в Dockerfile, чтобы вместо запуска команды docker build выполнить, когда новый контейнер создан с docker run? Я думаю, что это может быть полезно для инициализации тома, прикрепленного к файловой системе хоста.Выполнить команды для создания нового контейнера Docker

+1

FYI - Новый контейнер может быть создан с 'DOCKER run', но он также может быть создан с' DOCKER create'. AFAIK нет команды, которую можно запустить, когда запускается только 'docker create'. – kojiro

ответ

2

Посмотрите на команду ENTRYPOINT. Это указывает команду для запуска при запуске контейнера, независимо от того, что кто-то предоставляет в командной строке docker run. Фактически, работа скрипта ENTRYPOINT интерпретирует любую команду, переданную docker run.

+0

«Запуск docker» не будет повторно запускать команду «ENTRYPOINT»? –

+0

Скрипт 'ENTRYPOINT' будет запускаться на' docker start', но вы можете легко включить в скрипт логику, чтобы она могла проверить, была ли она ранее выполнена. – larsks

+0

Хотя я не думаю, что это хороший способ сделать это, это проблема Докера. «ENTRYPOINT», похоже, является надлежащим обходным решением. –

-2

Я думаю, что вы ищете CMD

https://docs.docker.com/reference/builder/#cmd

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

Примечание: не путать RUN с CMD. RUN фактически выполняет команду, и фиксирует результат; CMD ничего не выполняет во время сборки, но определяет заданную команду для изображения.

Вы также должны изучить использование контейнеров данных, чтобы увидеть это превосходное сообщение в блоге.

Стойких тома с Докерами - только данные контейнера модель http://container42.com/2013/12/16/persistent-volumes-with-docker-container-as-volume-pattern/

+0

Существует недостаток с использованием 'CMD':' Dockerfile' может иметь много из них, но будет работать только последний. –