Ответ 1
Вам нужно включить следующие строки в файл docker-compose.yml:
stdin_open: true
tty: true
Первый соответствует -i
в docker run
, а второй - -t
.
Есть ли способ запустить интерактивную оболочку в контейнере, используя только Docker Compose? Я пробовал что-то вроде этого, в моем docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Когда я запускаю этот контейнер, используя компоновку докеров, он немедленно выйдет. Есть ли какие-либо флаги, которые я могу добавить к команде entrypoint или как и дополнительный параметр для myapp, для запуска в качестве интерактивной оболочки?
Я знаю, что для этого есть собственные параметры команды докеры, просто любопытно, можно ли использовать только Docker Compose.
Вам нужно включить следующие строки в файл docker-compose.yml:
stdin_open: true
tty: true
Первый соответствует -i
в docker run
, а второй - -t
.
Канонический способ получить интерактивную оболочку с помощью docker-compose - использовать: docker-compose run --rm myapp
Вы можете установить stdin_open: true, tty: true
, однако это фактически не даст вам правильную оболочку с up
, потому что журналы передаются из всех контейнеров.
Вы также можете использовать
docker exec -ti <container name> /bin/bash
чтобы получить оболочку на запущенном контейнере.
В официальном примере запуска (https://docs.docker.com/compose/gettingstarted/) со следующим docker-compose.yml
:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
После того, как вы запустите это с помощью docker-compose up
, вы можете легко redis
в свой контейнер redis
или ваш web
контейнер:
docker-compose exec redis sh
docker-compose exec web sh
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
) и получить идентификатор контейнера, в котором я хочу иметь интерактивную оболочку (let назовите его xyz123).
Тогда просто выполнить задачу
docker exec -ti xyz123 /bin/bash
и вуаля, интерактивная оболочка.
Если кто-то из будущего также удивляется здесь:
docker-compose exec container_name sh
или же
docker-compose exec container_name bash
или вы можете запускать одиночные строки, такие как
docker-compose exec container_name php -v
Это происходит после того, как вы уже загрузили свои контейнеры
Вы можете сделать docker-compose exec SERVICE_NAME sh
в командной строке. SERVICE_NAME
определен в вашем docker-compose.yml
. Например,
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
SERVICE_NAME
будет "зоопарком".