web-dev-qa-db-fra.com

docker run avec --volume

J'essaie de docker certains services pour le développement sur ma machine et je me demande comment docker run --volume=.. travaux. Par exemple, si je fais quelque chose comme

docker run --volume=/path/to/data:/data [...]

volonté /path/to/data être (re) créé localement seulement s'il n'existe pas? Les données initiales sont-elles copiées à partir de l'image du conteneur?
Des liens vers la documentation pertinente seraient appréciés.

6
planetp

Le --volume est décrite dans docker run documents de référence , qui vous transfère vers les documents dédiés gérés dans des conteneurs docs, qui vous transmet ensuite sur les Lier les montures docs.

Là, ça dit:

Si tu utilises -v ou --volume pour monter un fichier ou un répertoire qui n'existe pas encore sur l'hôte Docker, -v créera le point final pour vous. Il est toujours créé sous forme de répertoire.

9
Oliver Charlesworth

Oui, le répertoire sur l'hôte FS ne sera créé que s'il n'existe pas déjà.

En même temps, Docker ne copiera rien de l'image dans le volume monté sur bind, donc le chemin de montage apparaîtra comme un répertoire vide à l'intérieur du conteneur. Tout ce qui était dans l'image sera caché.

Si vous avez besoin de copier des données originales, vous devez implémenter cette fonctionnalité vous-même. Heureusement, c'est une chose assez facile à faire.

  1. Parmi les dernières étapes de Dockerfile, déplacez ou copiez le répertoire d'origine ailleurs. Par exemple. RUN mv /data /original-data
  2. Ajoutez un script personnalisé à l'image, qui servirait de point d'entrée et copiera les données nécessaires dans le volume monté (voir l'exemple de code ci-dessous). Directive Dockerfile: ADD entrypoint.sh /entrypoint.sh
  3. Ajoutez la directive ENTRYPOINT pour demander à Docker d'appeler votre script dans le cadre de l'initialisation du conteneur: ENTRYPOINT ['/entrypoint.sh']

Le script entrypoint.sh pourrait ressembler à ceci (exemple simplifié):

#!/bin/bash
set -e
SOURCE_DIR=/original-data 
TARGET_DIR=/data
if [ $(find $TARGET_DIR -maxdepth 0 -type d -empty) 2>/dev/null) ]; then
   cp -r --preserve-all $SOURCE_DIR/* $TARGET_DIR/
fi

# continue Docker container initialization, execute CMD
exec $@

S'il y a déjà un script de point d'entrée dans votre image, vous pouvez simplement y ajouter la logique appropriée.

4
Hleb Rubanau