Интерактивная оболочка с использованием Docker Compose

Есть ли способ запустить интерактивную оболочку в контейнере, используя только Docker Compose? Я пробовал что-то вроде этого, в моем docker-compose.yml:

myapp:
  image: alpine:latest
  entrypoint: /bin/sh

Когда я запускаю этот контейнер, используя компоновку докеров, он немедленно выйдет. Есть ли какие-либо флаги, которые я могу добавить к команде entrypoint или как и дополнительный параметр для myapp, для запуска в качестве интерактивной оболочки?

Я знаю, что для этого есть собственные параметры команды докеры, просто любопытно, можно ли использовать только Docker Compose.

Ответ 1

Вам нужно включить следующие строки в файл docker-compose.yml:

stdin_open: true
tty: true

Первый соответствует -i в docker run, а второй - -t.

Ответ 2

Канонический способ получить интерактивную оболочку с помощью docker-compose - использовать: docker-compose run --rm myapp

Вы можете установить stdin_open: true, tty: true, однако это фактически не даст вам правильную оболочку с up, потому что журналы передаются из всех контейнеров.

Вы также можете использовать

docker exec -ti <container name> /bin/bash

чтобы получить оболочку на запущенном контейнере.

Ответ 3

В официальном примере запуска (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 

Ответ 4

docker-compose run myapp sh должен заключить сделку.

Существует некоторая путаница с up/run, но docker-compose run документы имеют большое объяснение: https://docs.docker.com/compose/reference/run

Ответ 5

Используя docker-compose, я нашел, что самый простой способ сделать это - сделать docker ps -a (после запуска моих контейнеров с docker-compose up) и получить идентификатор контейнера, в котором я хочу иметь интерактивную оболочку (let назовите его xyz123).

Тогда просто выполнить задачу docker exec -ti xyz123 /bin/bash

и вуаля, интерактивная оболочка.

Ответ 6

Если кто-то из будущего также удивляется здесь:

docker-compose exec container_name sh

или же

docker-compose exec container_name bash

или вы можете запускать одиночные строки, такие как

docker-compose exec container_name php -v

Это происходит после того, как вы уже загрузили свои контейнеры

Ответ 7

Вы можете сделать docker-compose exec SERVICE_NAME sh в командной строке. SERVICE_NAME определен в вашем docker-compose.yml. Например,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAME будет "зоопарком".