web-dev-qa-db-fra.com

Docker compose comment monter le chemin d'un conteneur à un autre?

J'ai nignx container Et un asset container Qui ont tous mes actifs construits à partir de grognement ou d'autres outils.

Maintenant, dans le fichier Docker compose, je veux monter le chemin d'accès au dossier de asset container's Dans nginx container Afin que nginx puisse servir ces fichiers.

  • Comment pouvons-nous faire cela? je ne me souviens pas mais je pense qu'il y a une option où nous pouvons partager le chemin d'un conteneur avec un autre.

  • Supposons que si j'élargis nginx à 2 conteneurs, ce montage fonctionnera-t-il pour toutes les instances de nginx?

  • si j'augmente asset container, que se passera-t-il?

  • je veux aussi monter cela avec mon hôte afin que le développement puisse se faire facilement.

28
dev.meghraj

Ce que vous voulez faire, c'est utiliser un volume, puis monter ce volume dans les conteneurs dans lesquels vous souhaitez qu'il apparaisse.

Complètement dans Docker

Vous pouvez le faire complètement à l'intérieur de Docker.

Voici un exemple (dépouillé - votre vrai fichier aurait bien plus que cela, bien sûr).

version: '3'
services:
  nginx:
    volumes:
      - asset-volume:/var/lib/assets
  asset:
    volumes:
      - asset-volume:/var/lib/assets

volumes:
  asset-volume:

En bas se trouve un seul volume défini, nommé "actif-volume".

Ensuite, dans chacun de vos services, vous dites à Docker de monter ce volume à un certain chemin. Je montre des exemples de chemins à l'intérieur du conteneur, ajustez-les simplement pour être le chemin que vous souhaitez qu'ils soient dans le conteneur.

Le volume est une entité indépendante qui n'appartient à aucun conteneur particulier. Il est simplement monté dans chacun d'eux et partagé. Si un conteneur modifie le contenu, ils voient tous les changements.

Notez que si vous préférez, un seul peut apporter des modifications, vous pouvez toujours monter le volume en lecture seule dans certains services, en ajoutant :ro à la fin de la chaîne de volume.

services:
  servicename:
    volumes:
      - asset-volume:/var/lib/assets:ro

Utilisation d'un répertoire hôte

Vous pouvez également utiliser un répertoire sur l'hôte et le monter dans les conteneurs. Cela a l'avantage de vous permettre de travailler directement sur les fichiers en utilisant vos outils en dehors de Docker (tels que votre éditeur de texte GUI et d'autres outils).

C'est la même chose, sauf que vous ne définissez pas de volume dans Docker, au lieu de cela de monter le répertoire externe.

version: '3'
services:
  nginx:
    volumes:
      - ./assets:/var/lib/assets
  asset:
    volumes:
      - ./assets:/var/lib/assets

Dans cet exemple, le répertoire local "assets" est monté dans les deux conteneurs à l'aide du chemin relatif ./assets.

Utilisation des deux en fonction de l'environnement

Vous pouvez également le configurer pour un environnement de développement et de production différent. Mettez tout dans docker-compose.yml sauf le volume monte. Créez ensuite deux fichiers supplémentaires.

  • docker-compose.dev.yml
  • docker-compose.prod.yml

Dans ces fichiers, mettez uniquement la configuration minimale pour définir le montage du volume. Nous allons mélanger cela avec le docker-compose.yml pour obtenir une configuration finale.

Ensuite, utilisez ceci. Il utilisera la configuration de docker-compose.yml et utilisera tout ce qui se trouve dans le deuxième fichier comme remplacement ou configuration supplémentaire.

docker-compose -f docker-compose.yml \
    -f docker-compose.dev.yml \
    up -d

Et pour la production, utilisez simplement le fichier prod au lieu du fichier dev.

L'idée ici est de conserver la plupart de la configuration dans docker-compose.yml, et uniquement l'ensemble minimal de différences dans les fichiers alternatifs.

Exemple:

docker-compose.prod.yml

version: '3'
services:
  nginx:
    volumes:
      - asset-volume:/var/lib/assets

docker-compose.dev.yml

version: '3'
services:
  nginx:
    volumes:
      - ./assets:/var/lib/assets
43
Dan Lowe