Как применить одинаковые тома к нескольким docker сервисам создания? - PullRequest
0 голосов
/ 01 мая 2020

Предположим, есть две службы, и у них определено несколько томов. Но большинство из этих томов используются в обеих службах:

version: '3'
services:
  service1:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - ./package.json:/package.json
      - ./tsconfig.json:/tsconfig.json
      - ./packages:/packages
      - ./node_modules:/node_modules
      - ./services/service1:/services/service1
    command: yarn service1:start

  service2:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - ./package.json:/package.json
      - ./tsconfig.json:/tsconfig.json
      - ./packages:/packages
      - ./node_modules:/node_modules
      - ./services/service2:/services/service2
    command: yarn service2:start

Есть ли способ предотвратить это дублирование?

Я бы хотел сделать что-то вроде этого:

version: '3'
services:
  service1:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - myVolumeList
      - ./services/service1:/services/service1
    command: yarn start

  service2:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - myVolumeList
      - ./services/service2:/services/service2
    command: yarn start

myVolumeList:
  - ./package.json:/package.json
  - ./tsconfig.json:/tsconfig.json
  - ./packages:/packages
  - ./node_modules:/node_modules

Edit: я использую docker compose только для локальной разработки. Объемы очень полезны для меня, потому что изменение файлов исходного кода автоматически перезапустит мои службы. Таким образом, однократного копирования файлов недостаточно

Ответы [ 2 ]

1 голос
/ 01 мая 2020
  1. Собственно, вы можете сделать:

Возможно, это решит вашу проблему.

version: "3"

services:
  srv1:
    image: someimage
    volumes:
      - data:/data
  srv2:
    image: someimage
    volumes:
      - data:/data

volumes:
  data:
Есть плагин - https://github.com/MatchbookLab/local-persist (прочитайте его перед использованием!) - который позволит вам изменить точку монтирования тома.

По сути, установите его: curl -fsSL <a href="https://raw.githubusercontent.com/MatchbookLab/local-persist/master/scripts/install.sh" rel="nofollow noreferrer">https://raw.githubusercontent.com/MatchbookLab/local-persist/master/scripts/install.sh</a> | sudo bash

Затем создайте том: docker volume create -d local-persist -o mountpoint=/data/images --name=images

Затем используйте столько контейнеров, сколько хотите:

docker run -d -v images:/path/to/images/on/one/ one
docker run -d -v images:/path/to/images/on/two/ two

Если вы хотите использовать docker -композицию, есть пример:

version: '3'

services:
  one:
    image: alpine
    working_dir: /one/
    command: sleep 600
    volumes:
      - data:/one/

  two:
    image: alpine
    working_dir: /two/
    command: sleep 600
    volumes:
      - data:/two/

volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data

Здесь почти такой же вопрос: docker пользовательская точка монтирования тома

Это работает только для docker -композитной версии '2':
version: '2'
services:

  srv1:
    image: sometag
    volumes_from:
      - data

  srv2:
    image: sometag
    volumes_from:
      - data

  data:
    image: sometag
    volumes:
      - ./code-in-host:/code
1 голос
/ 01 мая 2020

Код вашего приложения обычно должен быть в виде Docker . Вы можете запустить несколько контейнеров из одного изображения, возможно, с другим command:. Например, вы можете написать Dockerfile, например:

FROM node:lts-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
COPY ./ ./
CMD yarn start

Описав это изображение, вы можете ссылаться на него в docker-compose.yml, переопределяя command: для каждой службы:

version: '3'
services:
  service1:
    build: .
    command: 'yarn service1:start'
  service2:
    build: .
    command: 'yarn service2:start'

(Compose, вероятно, попытается создать отдельный образ для каждого сервиса, но из-за кэширования слоя Docker «построение» образа service2 будет выполняться очень быстро и со вторым тегом на том же изображении.)

Эта установка вообще не требует привязки, и если вы помещаете sh встроенные образы в реестр Docker, вы можете запустить их в системе без кода приложения или даже узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...