105 votes

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

J'ai un environnement de développement, je suis dockerizing et je voudrais la capacité de livereload mes modifications sans avoir à reconstruire des images docker. Je suis en utilisant le panneau de composer car redis est une de mes application des dépendances et j'aime être en mesure de relier un conteneur redis

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

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

redis:
    image: redis
    ports:
        - "6379"

J'ai reçu à ce point dans ma node application dockerfile où j'ai ajouter un volume, mais comment puis-je installer la machine hôte du répertoire dans le volume de sorte que tous mes live des modifications du code sont reflétées dans le conteneur?

Voici mon Dockerfile:

# 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

112voto

jkris Points 2324

Commander leur documentation

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

 volumes:
    - ./:/app
 

64voto

GreensterRox Points 2140

Il y a plusieurs options

Syntaxe Courte

À l'aide de l' host : guest format 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

Comme de docker-composer v3.2 vous pouvez utiliser la syntaxe longue qui permet la configuration des champs supplémentaires qui peuvent être exprimées dans le court formulaire comme mount type (volume, lier 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écouvrez https://docs.docker.com/compose/compose-file/#long-syntax-3 pour plus d'info.

9voto

Amin Shah Gilani Points 1450

C'était deux choses:

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

 node:
    volumes:
        - ./node:/app
 

J'ai déplacé les éléments 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 <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
 

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