2017-03-02 4 views
2

J'ai une situation où j'ai un fichier .json que je veux conserver entre les exécutions d'un conteneur donné. En outre, ce fichier doit être ajouté par le conteneur dans le cadre de son exécution.Partage d'un seul fichier de la machine hôte avec Docker Container et avoir le conteneur r + w dans le même fichier

La syntaxe que je l'ai utilisé jusqu'à présent est la suivante:

docker run -d -p 3001:3001 -v /usr/bob/database.json:/app/data/database.json:rw --name=myapp appImage 

Rien ne s'inséré dans le fichier (si je peux chat le contenu à l'intérieur et à l'extérieur du conteneur pour le confirmer est la même chose). J'ai veillé à ce que l'utilisateur root (oui pas la meilleure pratique) qui exécute docker possède tous les fichiers dans ce dossier et a plein rwx.

Qu'est-ce que le travail est si je lie au niveau du dossier, par exemple:

docker run -d -p 3001:3001 -v /usr/bob:/app/data --name=myapp appImage 

Quelqu'un peut-il expliquer la différence? Je pense que partager l'accès à un dossier au lieu d'un seul fichier est beaucoup moins précis et provoque également des changements structurels dans l'application (par exemple le contrôle de la source avec plusieurs fichiers (plus le fichier .json mentionné) dans le même dossier).

Merci d'avance pour les pointeurs.

Merci,

Andrew

+0

test exact même Avez, fonctionne très bien pour moi, en utilisant l'image busybox. –

+0

@FarhadFarahi c'est une question en plusieurs parties avec plus d'un choix - qu'avez-vous testé exactement? Merci. –

Répondre

3

Montage d'un fichier en tant que volume monte un inode spécifique à l'intérieur du conteneur. De nombreux outils qui modifient un fichier modifieront l'inode lors de l'écriture d'une nouvelle copie du fichier. Ce nouvel inode sera stocké dans le répertoire en tant que nouveau pointeur vers ce nom de fichier. Quand le répertoire est monté, vous voyez le changement dans votre hôte, mais sinon vous ne le voyez qu'à l'intérieur du conteneur puisque l'inode sur l'hôte et le pointeur dans le répertoire hôte sont inchangés.

Il y a plus de détails sur ce comportement dans le tutoriel de Docker sur les volumes: https://docs.docker.com/engine/tutorials/dockervolumes

+0

Brilliant - merci @BMitch. Ce qui me rendait suspect, c'est que je pensais avoir utilisé cette approche avant et maintenant il a cessé de fonctionner. Ce lien explique quand le changement a eu lieu (depuis V1.1) et bien que je ne puisse pas corriger le comportement, il me permet de savoir que je peux contourner ce problème et que rien ne me manque :) –