web-dev-qa-db-fra.com

Comment monter un répertoire d'hôte en tant que volume dans la composition de docker

Je dockerise dans un environnement de développement et j'aimerais pouvoir charger mes modifications sans avoir à reconstruire les images du menu fixe. J'utilise docker compose car redis est l'une des dépendances de mon application et j'aime pouvoir lier 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"

J'ai atteint un point dans le fichier docker de mon application node où j'ajoute un volume, mais comment puis-je monter le répertoire de l'hôte dans le volume afin que toutes mes modifications effectives 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 <[email protected]>

# 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
76
Upvote Me

Commander leur documentation

À première vue, vous pouvez effectuer les opérations suivantes sur votre fichier docker-compose.yml.

volumes:
    - ./:/app
86
jkris

Il y a quelques options

Syntaxe courte

En utilisant le format Host : guest, vous pouvez effectuer l’une des opérations 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

A partir de docker-compose v3.2, vous pouvez utiliser une syntaxe longue qui permet la configuration de champs supplémentaires pouvant être exprimés sous la forme abrégée, tels que mount type (volume, bind 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:

Départ https://docs.docker.com/compose/compose-file/#long-syntax- pour plus d'informations.

46
GreensterRox

C'était deux choses:

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

node:
    volumes:
        - ./node:/app

J'ai déplacé les morceaux npm install && nodemon app.js dans un CMD parce que RUN ajoute des éléments au système de fichiers Union et que mon volume ne fait pas partie d'UFS.

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <[email protected]>

# 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
8
Upvote Me

Si vous souhaitez monter un répertoire d'hôte particulier (/disk1/prometheus-data dans l'exemple suivant) en tant que volume dans la section volumes du fichier Docker Compose YAML, vous pouvez le faire comme suit, 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

Refs:

4
Yuci