Создать контейнер с помощью docker-compose, но запустить /etc/bash с опцией -it позже?

Я использую docker-compose для разработки. В процессе мне часто нужно собрать 5 контейнеров (1 для веб-сервера и 4 для postgres, redis, mongo и т. д.). Контейнер веб-сервера настроен на включение ссылок на другие контейнеры, он имеет свои собственные переменные ENV, смонтированные тома с хост-компьютера разработки.

Проблема в том, что мне не нужен веб-контейнер для запуска самого сервера. Вместо этого мне нужно выполнить /etc/bash с параметрами -it внутри веб-контейнера после создания всех зависимых контейнеров. Вот почему мой dockerfile для веб-контейнера заканчивается:

CMD /bin/true

Очевидно, такой контейнер не будет запущен, поэтому я не могу использовать что-то вроде

docker exec -it <CONTAINER ID> /bin/bash

"войти" в него и запустить node app.js или какие-то другие задачи.

Любой способ создать контейнер с композицией как часть файла docker-compose.yml, но запустить /etc/bash с опцией -it позже?

Кстати, я могу вручную запустить отдельный веб-контейнер с помощью

docker run \
--link postgres
--link ...
-e "NODE_ENV=development" \
-e ... \
...
...
..

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


person f1nn    schedule 05.09.2015    source источник
comment
Можете ли вы рассказать больше о вашем сценарии использования/рабочем процессе? Кажется излишне сложным?   -  person johnharris85    schedule 07.05.2016


Ответы (1)


Похоже, docker-compose run станет вашим другом. Из документов docker compose:

Запускает одноразовую команду для службы. Например, следующая команда запускает веб-службу и выполняет команду bash.

$ docker-compose run web bash

Команда docker-compose run <service-name> также гарантирует, что все необходимые контейнеры (например, те, которые предоставляют тома и ссылки) будут запущены до контейнера <service-name>, если они еще не запущены.

Если вы используете какие-либо сопоставления портов, вы можете рассмотреть возможность использования docker-compose run --service-ports <service-name>. Без этой опции docker-compose будет сопоставлять порты только при использовании docker-compose up.

Как и в случае с docker run, вы также можете использовать опцию --rm для удаления контейнеров после того, как вы закончите с ними.

Если ваше изображение использует ENTRYPOINT, вам следует рассмотреть возможность переопределения этого в вашем docker-compose.yml с помощью entrypoint: /bin/bash.

person Jan Suchotzki    schedule 21.09.2015
comment
Спасибо, Ян, но не совсем то, что мне нужно, однако я нашел решение. Постараюсь через несколько дней выложить. - person f1nn; 11.05.2016