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
Commander leur documentation
À première vue, vous pouvez effectuer les opérations suivantes sur votre fichier docker-compose.yml.
volumes:
- ./:/app
Il y a quelques options
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
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.
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
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: