web-dev-qa-db-fra.com

Équivalent de volumes_from dans Docker Compose v3

Il y a apparemment des questions similaires ici ( docker-compose volumes_de équivalent à la version 3 , Comment remplacer volumes_from dans docker-composer v3 ) mais je ne pense pas qu'ils répondent à la question (ou du moins je ne pas comprendre comment les réponses résolvent le problème). Alors laissez-moi essayer de demander à nouveau, très précisément.

J'ai ce 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

Le fait est que l'ensemble de volumes est défini une fois et que je peux facilement les réutiliser à l'aide de volumes_from.

Comment voudriez-vous réécrire cela en v3?

11
Borek Bernard

Pour répondre à votre question - c'est impossible avec v3 - voir la section ci-dessous. La v3 ne doit pas être utilisée comme successeur (également une déclaration officielle du docker), elle doit être utilisée dans les "cas d'essaims".

néanmoins, vous devez utiliser des volumes nommés. 

Vous pouvez le combiner avec des volumes de montage sur l'hôte comme ceci

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

Vous pouvez simplifier cela en utilisant la syntaxe longue introduite dans 3.2: https://docs.docker.com/compose/compose-file/#long-syntax-2 afin de pouvoir définir le volume nommé + bind sur le Hôte dans le fichier docker-compose Exemple:

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

ou en bref comme vous l'aviez

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

Ce que vous ne pouvez pas faire cependant, placer la syntaxe longue dans la définition de "volumes" de niveau supérieur pour attribuer un nom à ce volume et le réutiliser dans la section des volumes des services - ce n’est pas possible. Pour ce faire, vous utiliseriez un 

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

Et utilisez ensuite la syntaxe "docker volume create" sur la cli pour créer ces volumes avec une option de liaison, comme indiqué ci-dessus.

mais vous n'obtiendrez jamais ce que volumes_from faisait pour vous ici


Il n'y a pas d'équivalent de volumes_from dans la v3, car la v3 n'est pas un successeur de la v2, c'est une alternative - veuillez consulter mon commentaire et les sources ici https://github.com/rancher/rancher/issues/3316#issuecomment- 310889283

Pour résumer, volumes_from et les volumes se chevauchent dans le cas où volumes_from a été utilisé de manière incorrecte/dans le mauvais champ.

a) Si vous voulez que les données soient persistées across mises à niveau de pile (down + up), vous choisissez les volumes nommés - et maintenant, si 2 services ou plus doivent partager cela, montez ce volume nommé en utilisant volumes:.

b) Si vous préférez, le non doit conserver les données au-dessus des mises à niveau de la pile (par exemple, parce que son code source et l'image inclut effectivement une mise à niveau) en tant que scénario dans une application habituelle + httpd/proxy, créera un volume anon pour cet exemple /var/www dans le fichier Docker à l'aide de Volume /var/www, puis utilisez volumes_from pour le monter dans le service httpd.


le point principal avec b est que, lors des mises à niveau de la pile, le volume anon sera supprimé (`docker-compose down supprime les conteneurs anon, mais pas ceux nommés) et que la mise à niveau fonctionne comme prévu, vous avez un nouveau code base 

Essayer de faire la même chose avec les volumes nommés vous donnera une énorme surprise lors de la première mise à niveau, car le code est sur un volume nommé et que superposition la base de code sur la "nouvelle" image/nouveau conteneur, vous utiliserez l'ancienne base de code après la mise à niveau.

9
Eugen Mayer

Vous pouvez utiliser champs d'extension pour garder le code court, mais ce n'est pas tout à fait la même chose que volumes_from. Par exemple:

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
0
Dave Parrish