Інтерактивна оболонка за допомогою Docker Compose


271

Чи є спосіб запустити інтерактивну оболонку в контейнері лише за допомогою Docker Compose? Я спробував щось подібне у своєму docker-compose.yml:

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

Коли я запускаю цей контейнер за допомогою докер-композиції, він виходить негайно. Чи є якісь прапори, які я можу додати до команди введення чи як і додаткові параметри до myapp, щоб почати як інтерактивна оболонка?

Я знаю, що для цього досягти варіантів команд докер, просто цікаво, якщо це можливо, використовуючи лише Docker Compose.


Це не повинно працювати. Наприклад, якщо /bin/shу вашому композиційному файлі є кілька зображень з точкою входу, що це робити?
Xiongbing Jin

2
Гмм, чому б просто не запустити кілька снарядів? Наприклад, оболонка в контейнер mysql для роботи з mysql cli, а оболонка в контейнер резервного копіювання для запуску команд резервного копіювання?
друб

1
про що docker-compose run myapp?
ivoba

1
@ibova Проблема полягає в docker-compose run myappтому, що вона не відкриє порти. Тож вам доведеться користуватися, docker-compose run --service-ports myappале все-таки це не дуже зручно.
Дурень

entrypoint: /bin/shмає бутиentrypoint: "/bin/sh"
кодовий фільм

Відповіді:


341

У ваш docker-compose.yml потрібно включити наступні рядки:

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

Перший відповідає -iв, docker runа другий - -t.


3
що stdin_openє відсутнім посиланням, для просто надання мені очікуваної поведінки, коли я приєднуюся до одного з моїх контейнерів, у якому вже працює оболонка.
Charney Kaye

9
@TheFool, Навіть у мене те саме питання. Краще бігтиdocker-compose run <service_name>
Асват К

4
Куди саме це додано? Всередині послуги?
problemofficer

Це, здається, є найкращою відповіддю на питання ОП .. оскільки проблема полягає в тому, що контейнер виходить негайно в іншому випадку, тому отримання оболонки при використанні docker execна ньому не працюватиме.
RoyM

Це дає мені помилку в Windows:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator

210

Канонічним способом отримання інтерактивної оболонки з докер-композицією є використання: docker-compose run --rm myapp

stdin_open: true, tty: trueОднак ви можете встановити , що насправді не надасть вам належну оболонку up, оскільки журнали передаються з усіх контейнерів.

Ви також можете використовувати

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

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


16
Зауважте, що вам потрібно додати, --service-portsякщо ви відкриєте будь-які порти (тобто для веб-сервера)
epelc

9
Я оновив свою відповідь, щоб надати більше інформації та додав --rmпрапор, щоб контейнер був видалений. Відповідь @ lynx0123 невірна. Ви не отримаєте інтерактивну оболонку, якщо запустите docker-compose up.
дніфін

2
Щоб змусити це працювати за допомогою Docker для Windows, мені знадобилася docker-compose v. 1.9.0 (див. Випуск Github та PR ). Станом на 19.12.16, це лише версія з бета-версією Docker для Windows. Потім docker-compose runпрацює. Ви також хочете додати command: /bin/bashдо docker-compose.yml.
Йосиф238

5
Це має бути головна відповідь. Це те, що я шукав, коли прийшов сюди.
mkasberg

8
docker-compose up -d && docker attach <container_name>
Аарон Макміллін

58

В офіційному прикладі роботи ( 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контейнером або webконтейнером за допомогою:

docker-compose exec redis sh
docker-compose exec web sh 

44

docker-compose run myapp sh повинні зробити справу.

Існує деяка плутанина з up/ run, але docker-compose runдокументи мають велике пояснення: https://docs.docker.com/compose/reference/run


1
Дуже дякую. Ще трохи додати для уточнення. docker-compose run [your-service-name-определен-in-docker-compose.yml] [sh або bash].
theeranitp

23

Використовуючи docker-compose, я знайшов найпростіший спосіб зробити це - зробити docker ps -a(після запуску контейнерів docker-compose up) і отримати ідентифікатор контейнера, в якому я хочу мати інтерактивну оболонку (назвемо це xyz123).

Тоді виконати просту справу docker exec -ti xyz123 /bin/bash

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


1
Не впевнений, чому це було знято з голосу - це прекрасний спосіб налагодити на випадок, якщо щось піде не так, і я застосував цей метод з успіхом, наприклад, протягом хвилини після прочитання цього рішення.
ericmjl

4
@ericmjl Оскільки це двоступеневий процес, коли запитання задається спеціально щодо використання функцій docker-compose, і вже було зазначено в іншій відповіді
OneCricketeer

19

Якщо хтось із майбутнього також блукає тут:

docker-compose exec container_name sh

або

docker-compose exec container_name bash

або ви можете запускати окремі рядки

docker-compose exec container_name php -v

Це після того, як у вас вже будуть запущені контейнери


2

Це можна зробити docker-compose exec SERVICE_NAME shв командному рядку. Значення SERVICE_NAMEвизначено у вашому docker-compose.yml. Наприклад,

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

Був SERVICE_NAMEби "зоофер".


2

Це питання для мене дуже цікаво, оскільки у мене виникають проблеми, коли запуск контейнера після виконання завершується негайно вийти, і я виправив за допомогою -it:

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

І коли я повинен автоматизувати це за допомогою докерного складу:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

Це робить трюк: stdin_open: true, tty: true

Це проект, створений програмою create-react-app

Dockerfile.dev виглядає так:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

Сподіваємось, що цей приклад допоможе іншим запустити фронтенд (реагувати на прикладі) у контейнер докера.


0

Якщо ymlце називається, docker-compose.ymlйого можна запустити з простого $ docker-compose up. Відповідне вкладення терміналу може бути просто (врахуйте, що ymlвказана послуга називається myservice):

$ docker-compose exec myservice sh

Однак якщо ви використовуєте інше ymlім'я файлу, наприклад docker-compose-mycompose.yml, воно повинно бути запущено з використанням $ docker-compose -f docker-compose-mycompose.yml up. Щоб приєднати інтерактивний термінал, вам також потрібно вказати ymlфайл, як:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.