Эквивалент volume_from в Docker Compose v3

Здесь есть похожие на вид вопросы ( docker-compose volume_from, эквивалентный версии 3, как заменить volume_from в docker-composer v3), но я не думаю, что они отвечают на вопрос (или, по крайней мере, я не понимаю, как ответы решают проблема). Итак, позвольте мне попробовать еще раз, очень конкретно.

У меня есть этот v2 docker-compose.yml:

version: '2'
services:
  full-tests:
    volumes:
      - ..:/opt/project
      - ../../../ext-libs:/opt/ext-libs
      - ./third-mapping:/opt/third

  unit-tests:
    volumes_from: full-tests

Дело в том, что набор томов определяется один раз, и я легко могу использовать их, используя volumes_from,

Как бы вы переписали это в v3?

3 ответа

Решение

Чтобы ответить на ваш вопрос - это невозможно с v3 - см. Раздел ниже. v3 не должен использоваться в качестве преемника (также является официальным заявлением докера), он должен использоваться в "случаях роя".

тем не менее, то, что вы должны сделать, это использовать именованные тома.

Вы можете комбинировать его с томами для подключения к хосту, как это

docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind

Вы можете упростить это, используя длинный синтаксис, представленный в 3.2: https://docs.docker.com/compose/compose-file/, чтобы вы могли определить именованный том + связывание на хосте в докере Пример составления файла:

services:
   full-tests:
    volumes:     
      - type: volume
        source: ../
        target: /opt/project
      - type: volume
        source: ../../../ext-libs
        target: /opt/ext-libs

или короче как ты

services:
   full-tests:
     volumes:     
      - ../:/opt/project
      - ../../../ext-libs:/opt/ext-libs

Но вы не можете этого сделать, поместив длинный синтаксис в определение "тома" верхнего уровня, чтобы дать этому тому имя, и повторно использовать его в разделе томов в сервисах - это невозможно. Для этого вы должны использовать

volumes:
  project:
    external: true
  third-party:
    external: true

А затем используйте синтаксис "docker volume create" в cli для создания этих томов с опцией связывания, как показано выше.

но вы никогда не поймете, что объемы_ от вас делали здесь


В v3 нет эквивалента volume_from, поскольку v3 не является преемником v2, его альтернатива - см. Мой комментарий и источники здесь https://github.com/rancher/rancher/issues/3316

Подводя итог, мы можем сказать, что объемы_от и объемы перекрываются в том случае, если просто использовался тот же объем / в неправильном поле.

a) Если вы хотите, чтобы данные сохранялись при обновлении стека (вниз + вверх), вы выбираете именованные тома - и теперь, если 2+ сервисы должны поделиться этим, просто смонтируйте этот именованный том, используя volumes:,

б) Если вы, темне менее, не хотите, чтобы данные сохранялись при обновлении стека (например, потому что его исходный код и изображение фактически содержат обновления этого), как в обычном сценарии приложения + httpd / proxy, вы создадите anon-volume для этого например /var/www в Dockerfile, используя Volume /var/www а затем используйте volume_from, чтобы смонтировать его в httpd оказание услуг.


основной момент с b состоит в том, что при обновлении стека анонный том будет удален ( `docker-compose down удаляет анонные контейнеры, но не именованные), и, таким образом, обновление работает, как и ожидалось, у вас есть новая кодовая база

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

Вы можете использовать поля расширения, чтобы сделать код коротким, но это не совсем то же самое, что volumes_from, Например:

version: '3.7'
x-volumes:
  &my-volumes
      - ..:/opt/project
      - ../../../ext-libs:/opt/ext-libs
      - ./third-mapping:/opt/third

services:
  full-tests:
    volumes:
      *my-volumes

  unit-tests:
    volumes:
      *my-volumes

У меня есть докер-композитор версии 3, работающий с унисон. В основном пришлось заменить "volume_from" и создать глобальную декларацию "volume".

version: "3"
services:
  unison:
    container_name: xxx_unison
    image: onnimonni/unison
    environment:
      - UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/
      - UNISON_USER=www-data
      - UNISON_UID=1000
      - UNISON_GID=1001    
    volumes:
      - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
    networks: 
      - frontend    
    ports:
      - "5000:5000"    
  database: 
    container_name: xxx_database
    image: percona
    depends_on:
      - unison
    environment:
      - MYSQL_ROOT_PASSWORD=xxx
      - MYSQL_DATABASE=xxx # Assign a database to be created on container first load  
    volumes: 
      - ./mysql/import:/docker-entrypoint-initdb.d
      - ./mysql/data/:/var/lib/mysql/ 
      - ./logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d          
    ports: 
      - "3306:3306"
    networks: 
      - frontend
  web:
    container_name: xxx_web
    image: ubuntu
    depends_on:
      - unison    
    volumes: 
      - ./nginx/ssl/:/etc/nginx/ssl/ 
      - ./logs/:/var/log/nginx
      - ./shell/run.sh:/run.sh
      - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
    ports:
      - "80:80"
      - "443:443"
    networks: 
      - frontend
    env_file:
      - ./.env      
networks:
  frontend:
volumes:
  unison_file:
Другие вопросы по тегам