367 votes

Comment monter un répertoire hôte en tant que volume dans docker compose ?

J'ai un environnement de développement que je suis en train de dockeriser et j'aimerais avoir la possibilité de charger en direct mes modifications sans avoir à reconstruire les images docker. J'utilise docker compose parce que redis est l'une des dépendances de mon application et j'aime pouvoir relier un conteneur redis.

J'ai deux conteneurs définis dans mon docker-compose.yml :

node:
  build: ./node
  links:
    - redis
  ports:
    - "8080"
  env_file:
    - node-app.env

redis:
  image: redis
  ports:
    - "6379"

Je suis arrivé au point où dans mon node J'ai ajouté un volume dans le dockerfile de l'application, mais comment monter le répertoire de l'hôte dans le volume pour que toutes mes modifications du code soient reflétées dans le conteneur ?

Voici mon Dockerfile actuel :

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.me>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# TODO: link the current . to /app

# Define working directory
WORKDIR /app

# Run npm install
RUN npm install

# Expose port
EXPOSE  8080

# Run app using nodemon
CMD ["nodemon", "/app/app.js"]

Mon projet ressemble à ceci :

/
- docker-compose.yml
- node-app.env
- node/
  - app.js
  - Dockerfile.js

383voto

jkris Points 2324

Découvrez leur documentation

D'après ce que vous voyez, vous pourriez faire ce qui suit dans votre docker-compose.yml

volumes:
    - ./:/app

./ est le répertoire de l'hôte, et /app est le répertoire cible pour les conteneurs.


EDIT :
La source de la documentation précédente mène maintenant à l'historique des versions, vous devrez sélectionner la version de compose que vous utilisez et chercher la référence.

Pour les paresseux - v3 / v2 / v1

Remarque : la syntaxe reste la même pour toutes les versions à partir de cette édition.

2 votes

J'ai essayé, ça n'a pas marché : Error: Cannot find module '/data/app.js'

4 votes

Attendez votre VOLUME et votre WORKDIR pointent sur /app/ pourquoi votre CMD pointe vers /data

1 votes

C'était une erreur ! Merci de l'avoir remarqué ! Corrigé, et maintenant j'obtiens Error: Cannot find module 'express' Je vais essayer quelques trucs maintenant.

234voto

GreensterRox Points 2140

Il existe plusieurs options

Syntaxe courte

Utilisation de la host : guest vous pouvez effectuer l'une des actions suivantes :

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

Syntaxe longue

À partir de docker-compose v3.2, vous pouvez utiliser la syntaxe longue qui permet de configurer des champs supplémentaires qui peuvent être exprimés dans la forme courte, par exemple mount type (volume, liaison ou tmpfs) et read_only .

version: "3.2"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:

Vérifiez https://docs.docker.com/compose/compose-file/#long-syntax-3 pour plus d'informations.

111voto

Yuci Points 3538

Si vous souhaitez monter un répertoire hôte particulier ( /disk1/prometheus-data dans l'exemple suivant) en tant que volume dans la base de données de l volumes du fichier YAML de Docker Compose, vous pouvez le faire comme ci-dessous, par exemple :

version: '3'

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - prometheus-data:/prometheus

volumes:
  prometheus-data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /disk1/prometheus-data

Au fait, dans le Dockerfile de Prometheus, vous pouvez trouver le fichier VOLUME comme ci-dessous, qui le marque comme contenant des volumes montés en externe depuis l'hôte natif, etc. (Notez cependant : cette instruction n'est pas indispensable pour monter un volume dans un conteneur) :

Dockerfile

...
VOLUME ["/prometheus"]
...

Réf :

4 votes

Ça a marché. Merci. Où se trouve la documentation sur le local le type de conducteur ?

0 votes

@mmell La documentation est le premier lien Refs ( docs.docker.com/compose/compose-file/#driver ) Il se lit comme suit : Indiquez quel pilote de volume doit être utilisé pour ce volume. Par défaut, il s'agit du pilote que le moteur Docker a été configuré pour utiliser, ce qui, dans la plupart des cas, est le suivant local

2 votes

@mmell, vous pouvez trouver plus de détails dans cette question : stackoverflow.com/questions/42195334/

17voto

Amin Shah Gilani Points 1450

C'était deux choses :

J'ai ajouté le volume dans docker-compose.yml :

node:
  volumes:
    - ./node:/app

J'ai déplacé le npm install && nodemon app.js dans un CMD porque RUN ajoute des choses au système de fichiers de l'Union, et mon volume ne fait pas partie de l'UFS.

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.me>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# Define working directory
WORKDIR /app

# Expose port
EXPOSE  8080

# Run npm install
CMD npm install && nodemon app.js

13voto

Mukundhan Points 837

Nous devons crear votre propre volume docker mis en correspondance avec le répertoire des hôtes avant que nous mention dans le docker-compose.yml como externe

1. créer un volume nommé action

docker volume create --driver local \
--opt type=none \
--opt device=/home/mukundhan/share \
--opt o=bind share

2. l'utiliser dans votre docker-compose

version: "3"

volumes:
  share:
    external: true

services:
  workstation:
    container_name: "workstation"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
      - ./source:/source:consistent
    working_dir: /source
    ipc: host
    privileged: true
    shm_size: '2gb'
  db:
    container_name: "db"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
    working_dir: /source
    ipc: host

De cette façon, nous pouvons partager le même répertoire avec plusieurs services fonctionnant dans différents conteneurs.

0 votes

Pourquoi ai-je besoin d'avoir ipc : host ?

0 votes

Qui n'est nécessaire que lorsque nous devons lier le réseau à l'hôte lui-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X