откройте вкладку оболочки для каждой службы в файле docker compose - PullRequest
0 голосов
/ 30 мая 2020

У меня есть клиент-серверное приложение (оба написаны на C ++), которым я управляю с помощью docker -compose. Я новичок в технологии docker, и мне интересно, может ли docker-compose up выполнить для меня следующую работу:

  1. запускать службы
  2. открыть вкладку оболочки для каждого service в файле docker-compose.yml.

Мне нужна отдельная оболочка для каждой службы, потому что каждый раз, когда я меняю код (на клиенте или сервере), я хотел бы остановить программу, перекомпилировать ее и повторно запустить. На данный момент я использую обходной путь:

  1. запустить docker-compose up
  2. запустить docker container ls, чтобы найти идентификатор контейнера
  3. для каждого контейнера откройте вкладку оболочки и запустите docker exec -it <container-id> /bin/bash

Интересно, есть ли более элегантное решение. Я использую Ubuntu, и это мой docker-compose.yml:

version: '3.1'
services: 
    server:
        build: ./server
        ports: 
            - "3500:3500"
        volumes: 
            - ./server/src:/home/src
            - ./server/bin:/home/bin
        working_dir: /home/src
        stdin_open: true
        tty: true
    client:
        build: ./client
        ports: 
            - "2800:2800"
        volumes: 
            - ./client/src:/home/src
            - ./client/bin:/home/bin
        working_dir: /home/src
        stdin_open: true
        tty: true
    db:
        image: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: example

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Вы можете упростить эту настройку, используя собственную систему образов Docker. Обычно инструкции по компиляции приложения будут встроены в Dockerfile, поэтому запуск docker-compose up --build приведет к перекомпиляции. Система кеширования слоев Docker делает это очень быстро, если приложение фактически не изменилось. После этого вам не понадобится volumes: для перезаписи содержимого изображения, и вам не потребуется отдельно интерактивная оболочка, прикрепленная к каждому контейнеру.

Если вы удалите volumes: и некоторые другие настройки которые либо находятся в Dockerfile, либо обычно вам не нужны, что оставляет вам гораздо более короткие docker-compose.yml:

version: '3'
services: 
    server:
        build: ./server
        ports: 
            - "3500:3500"
        # volumes: undo what server/Dockerfile does
        # working_dir: is the Dockerfile WORKDIR
        # server-type processes don't usually need stdin_open: or tty:
    client:
        build: ./client
        ports: 
            - "2800:2800"
    db:
        # as above

Когда вы что-то меняете, вы можете запустить docker-compose up --build -d и он перестроит и перезапустит указанные c объекты, которые необходимо перестроить и перезапустить.

Многие команды docker имеют прямые docker-compose эквиваленты. Если вам действительно нужна интерактивная оболочка в контейнере, например, вы можете

docker-compose exec server /bin/sh

docker-compose exec найдет для вас идентификатор Docker контейнера и по умолчанию docker exec -it флаги.

0 голосов
/ 30 мая 2020

Вот мой пример с Nginx

    version: '3'
    services:
        nginx:
            stdin_open: true
            tty: true
            image: nginx        
            ports: 
                - "80:80"

Попасть в контейнер в интерактивном режиме с docker-compose run <SERVICE_NAME> sh. Вот команда для входа в интерактивный режим контейнера Nginx

docker-compose run nginx sh
...