web-dev-qa-db-fra.com

Montage Docker sur le contenu remplaçant le dossier

J'ai un .net Core web Api ayant des fichiers de configurations sous un dossier appelé Config. J'ai créé l'image et un conteneur à partir de celui-ci, et je vois correctement à l'aide du terminal, que le conteneur contient le dossier et les fichiers de configuration à l'intérieur.

Mon problème est que jusqu'à présent, je n'ai pas trouvé de moyen de créer le même conteneur en montant/liant le dossier Config à un chemin physique, en suivant les exigences:

1) Montez le dossier Config sur un emplacement hôte spécifique

2) Lors de la création du conteneur, le dossier Config doit être rempli avec les fichiers de l'image

3) Lors de la création du conteneur, remplacez tout fichier existant déjà présent dans le dossier par ceux de l'image

4) Pouvoir personnaliser les fichiers de configuration dans le dossier de l'hôte

Ma commande create:

    docker --tls -H="$containerUrl" `
        create `
        --hostname $hostname `
        --name $containerName `
        --mac-address=$containerMacAddress `
        --ip $containerIpAddress `
        --net "bridged-network" `
        --workdir '/app' `
        --mount type=bind,src=$configVolumePath,target=/app/Config `
        --publish "0.0.0.0::80" `
        -t `
        -i $imageName":"$script:buildversion    

En utilisant - mount avec le type bind , comme spécifié dans la documentation, s'il y a un fichier dans le dossier, ceux-ci sont cachés à l'intérieur du conteneur et l'application verra les fichiers déployés. Le problème de cette solution est que je ne peux pas mettre à jour les fichiers du dossier config depuis l'hôte.

Maintenant, en supprimant type = bind j'obtiens le même résultat, et c'est déroutant.

J'ai essayé d'utiliser le volume - volume $ configVolumePath ":/app/Config: rw" , mais ce faisant, les fichiers existants dans le répertoire Host sont ne sont pas remplacées et ce sont celles qui seront utilisées dans le conteneur.

Notes supplémentaires, je ne spécifie rien dans le Dockerfile ou la composition liée au montage de volume, et je n'ai pas essayé de créer un volume pour ensuite l'utiliser comme source, mais je ne pense pas que cela ferait une différence.

Le serveur de conteneur fonctionne sur un NAS et voici la version:

 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   781516c
 Built:        Thu Aug  3 16:04:05 2017
 OS/Arch:      linux/AMD64

De toute évidence, il me manque quelque chose et je dois en savoir plus sur Docker, quelqu'un peut-il m'aider?

Mes références:

1) https://docs.docker.com/engine/admin/volumes/bind-mounts/

2) https://docs.docker.com/engine/admin/volumes/volumes/

10
Norcino

Tout d'abord, les volumes de docker ou les montages de liaison se comportent comme des montages Linux.

Si le volume/montage hôte existe et contient des fichiers, il "remplacera" tout ce qui se trouve dans le conteneur. Sinon, les fichiers du conteneur seront mis en miroir sur le volume/montage de l'hôte et le dossier du conteneur et l'hôte seront synchronisés. Dans les deux cas, l'édition des fichiers sur l'hôte sera TOUJOURS re-sélectionnée à l'intérieur du conteneur.

Dans votre cas, vous pouvez effectuer les opérations suivantes:

docker volume create --driver local \
    --opt type=none \
    --opt device=$configVolumePath \
    --opt o=bind \
    config_vol

Cela créera un volume qui sera conservé dans $ configVolumePath sur l'hôte.

Lors de la création du conteneur, utilisez ce volume:

docker create --volume config_vol:/app/Config

Ce que vous obtiendrez sera au démarrage, le dossier Host sera vide et les fichiers de l'image seront "copiés" dans le dossier Host. Modification de fichiers dans $configVolumePath sera relecté à l'intérieur du conteneur et de même les fichiers édités à l'intérieur du conteneur /app/Config sera reflété dans $configVolumePath sur l'hôte.

17
yamenk