Есть ли способ запустить интерактивную оболочку в контейнере, используя только Docker Compose? Я пробовал что-то вроде этого, в моем docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Когда я запускаю этот контейнер с помощью docker-compose, он сразу же закрывается. Есть ли какие-либо флаги, которые я могу добавить к команде entrypoint или как дополнительную опцию для myapp, чтобы запускать как интерактивную оболочку?
Я знаю, что для этого есть собственные опции команды docker, просто любопытно, если это возможно, используя только Docker Compose.
/bin/sh
точкой входа в вашем файле компоновки, что он должен делать?docker-compose run myapp
?docker-compose run myapp
том, что он не будет выставлять порты. Таким образом, вы должны использовать,docker-compose run --service-ports myapp
но все же это не очень удобно.entrypoint: /bin/sh
должно бытьentrypoint: "/bin/sh"
Ответы:
Вам нужно включить следующие строки в ваш docker-compose.yml:
Первый соответствует
-i
в,docker run
а второй-t
.источник
stdin_open
недостающее звено, просто для предоставления мне ожидаемого поведения, когда я присоединяюсь к одному из моих контейнеров, на котором уже запущена оболочка.docker-compose run <service_name>
docker exec
для него не сработает.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
Канонический способ получить интерактивную оболочку с помощью docker-compose - это использовать:
docker-compose run --rm myapp
Вы можете установить
stdin_open: true, tty: true
, однако, что на самом деле не даст вам надлежащую оболочкуup
, потому что журналы передаются из всех контейнеров.Вы также можете использовать
получить снаряд на работающем контейнере.
источник
--service-ports
если вы выставите какие-либо порты (например, для веб-сервера)--rm
флаг, чтобы контейнер был удален. Ответ @ lynx0123 не верный. Вы не получите интерактивную оболочку, если вы запуститеdocker-compose up
.docker-compose run
работает. Вы также хотите добавитьcommand: /bin/bash
в docker-compose.yml.В официальном примере начала работы ( https://docs.docker.com/compose/gettingstarted/ ) со следующим
docker-compose.yml
:После того, как вы начнете с этого
docker-compose up
, вы можете легко заложить в вашredis
контейнер илиweb
контейнер с помощью:источник
docker-compose run myapp sh
должен сделать сделку.Существует некоторая путаница с
up
/run
, но уdocker-compose run
документов есть отличное объяснение: https://docs.docker.com/compose/reference/runисточник
Используя docker-compose, я нашел, что самый простой способ сделать это - сделать
docker ps -a
(после запуска моих контейнеров сdocker-compose up
) и получить идентификатор контейнера, в котором я хочу иметь интерактивную оболочку (назовем это xyz123).Тогда это просто выполнить
docker exec -ti xyz123 /bin/bash
и вуаля, интерактивная оболочка.
источник
Если кто-то из будущего также бродит здесь:
или
или вы можете запустить отдельные строки, такие как
То есть после того, как ваши контейнеры уже запущены и работают
источник
Вы можете сделать
docker-compose exec SERVICE_NAME sh
в командной строке. ЭтоSERVICE_NAME
определено в вашемdocker-compose.yml
. Например,Это
SERVICE_NAME
будет "зоопарк".источник
Этот вопрос очень интересен для меня, потому что у меня есть проблемы, когда я запускаю контейнер после того, как выполнение завершается, немедленно завершается и я исправляю с помощью -it:
И когда я должен автоматизировать это с помощью docker compose:
Это делает трюк: stdin_open: true, tty: true
Это проект, созданный с помощью create-реагировать-приложение
Dockerfile.dev это выглядит так:
Надеюсь, что этот пример поможет другим запустить внешний интерфейс (например, реагировать) в контейнер докера.
источник
Если
yml
вызывается,docker-compose.yml
он может быть запущен с простым$ docker-compose up
. Соответствующее присоединение терминала может быть простым (учтите, чтоyml
он указал вызываемую службуmyservice
):Однако, если вы используете другое
yml
имя файла, напримерdocker-compose-mycompose.yml
, его следует запустить с помощью$ docker-compose -f docker-compose-mycompose.yml up
. Чтобы подключить интерактивный терминал, вы также должны указатьyml
файл, например:источник