Supposons que j'ai un conteneur Docker et un dossier sur mon hôte /hostFolder
. Maintenant, si je veux ajouter ce dossier au conteneur Docker en tant que volume, je peux le faire en l'utilisant ADD
dans Dockerfile
ou en le montant en tant que volume.
Jusqu'ici tout va bien.
Maintenant , /hostFolder
contient un sous-dossier, /hostFolder/subFolder
.
Je veux monter /hostFolder
dans le conteneur Docker (que ce soit en lecture-écriture ou en lecture seule n'a pas d'importance, fonctionne à la fois pour moi), mais je ne veux PAS l' inclure /hostFolder/subFolder
. Je veux exclure cela, et je veux aussi que le conteneur Docker puisse apporter des modifications à ce sous-dossier, sans la conséquence de l'avoir également changé sur l'hôte.
Est-ce possible? Si c'est le cas, comment?
la source
Réponses:
En utilisant docker-compose, je peux utiliser node_modules localement, mais l'ignorer dans le conteneur docker en utilisant la syntaxe suivante dans le
docker-compose.yml
Donc, tout
./angularApp
est mappé/opt/app
et ensuite je crée un autre volume de montage/opt/app/node_modules/
qui est maintenant un répertoire vide - même si dans ma machine locale./angularApp/node_modules
n'est pas vide.la source
/opt/app/node_modules/
par un autre répertoire du même nom. Une erreur se produit: «volume occupé»-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Si vous souhaitez que les sous-répertoires soient ignorés par docker-compose mais persistants, vous pouvez effectuer les opérations suivantes dans
docker-compose.yml
:Cela montera votre répertoire actuel en tant que volume partagé, mais montera un volume docker persistant à la place de votre
node_modules
répertoire local . Ceci est similaire à la réponse de @kernix, mais cela permettranode_modules
de persister entre lesdocker-compose up
exécutions, ce qui est probablement le comportement souhaité.la source
docker-compose down
supprimera les conteneurs, mais le volume persistera jusqu'à ce que vousdocker system prune
node_modules:
volume nommé "ignore" le/app/node_modules
dans le conteneur Docker, peut trouver ce post utile Comment Docker gère-t-il plusieurs types de montage?Pour exclure un fichier, utilisez ce qui suit
la source
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. L'ajout d'une barre oblique de fin n'a pas aidé./dev/null
dans le conteneur, en tant que fichier de périphérique.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Ce n'est pas exactement ce que l'OP recherchait, mais cela m'a été très utile, car j'avais besoin d'exclure un seul fichier.Tout d'abord, l'utilisation de l'
ADD
instruction dans un Dockerfile est très différente de l'utilisation d'un volume (soit via l'-v
argument to,docker run
soit dans l'VOLUME
instruction dans un Dockerfile). Les commandesADD
etCOPY
prennent simplement une copie des fichiers au moment de l'docker build
exécution. Ces fichiers ne sont pas mis à jour tant qu'une nouvelle image n'est pas créée avec ladocker build
commande. En revanche, l'utilisation d'un volume signifie essentiellement "ce répertoire ne doit pas être stocké dans l'image du conteneur; utilisez plutôt un répertoire sur l'hôte"; chaque fois qu'un fichier à l'intérieur d'un volume est modifié, l'hôte et le conteneur le verront immédiatement.Je ne crois pas que vous puissiez obtenir ce que vous voulez en utilisant des volumes, vous devrez repenser la structure de votre répertoire si vous voulez le faire.
Cependant, c'est assez simple à réaliser en utilisant
COPY
(ce qui devrait être préféréADD
). Vous pouvez soit utiliser un.dockerignore
fichier pour exclure le sous-répertoire, soit vous pouvezCOPY
tous les fichiers puis faire unRUN rm bla
pour supprimer le sous-répertoire.N'oubliez pas que tous les fichiers que vous ajoutez à l'image avec
COPY
ouADD
doivent se trouver dans le contexte de construction, c'est-à-dire dans ou sous le répertoire àdocker build
partir duquel vous exécutez .la source
.dockerignore
fichier pour exclure un sous-répertoire (ou même un répertoire). Étant donné que c'est l'objectif déclaré du fichier, c'est assez étrange.squash
les couches. L'un est github.com/goldmann/docker-squash et un autre utiliseoc ex dockerbuild
le projet openshift.On dirait que l'ancienne solution ne fonctionne plus (du moins pour moi). La création d'un dossier vide et le mappage du dossier cible à celui-ci ont cependant aidé.
la source
docker-compose 1.25.0-rc3
la syntaxe de fichier v3.Avec la ligne de commande docker:
L'
-v
option peut également être utilisée (crédit à Bogdan Mart ), mais elle--mount
est plus claire et recommandée .la source
pour les personnes qui ont également eu le problème que le dossier node_modules écraserait toujours à partir de votre système local et vice versa
C'est la solution, avec la fin
/
après les node_modules étant le correctif.la source
Pour exclure un fichier monté contenu dans le volume de votre machine, vous devrez l'écraser en allouant un volume à ce même fichier. Dans votre fichier de configuration:
Un exemple dans votre dockerfile:
la source