web-dev-qa-db-fra.com

Comment monter un répertoire dans un conteneur Docker sur l'hôte?

Supposons que j'ai une application avec ce Dockerfile simple:

//...
RUN configure.sh --logmyfiles /var/lib/myapp
ENTRYPOINT ["starter.sh"]
CMD ["run"]
EXPOSE 8080
VOLUME ["/var/lib/myapp"]

Et je lance un conteneur à partir de cela:

Sudo docker run -d --name myapp -p 8080:8080 myapp:latest

Il fonctionne donc correctement et stocke certains journaux dans /var/lib/myapp du conteneur docker.

Ma question

J'ai également besoin que ces fichiers journaux soient automatiquement enregistrés dans l'hôte, alors comment puis-je monter le /var/lib/myapp du conteneur au /var/lib/myapp sur le serveur hôte (sans supprimer le conteneur actuel)?

Modifier

Je vois également Docker - Monter le répertoire du conteneur à l'hôte , mais cela ne résout pas mon problème, j'ai besoin d'un moyen de sauvegarder mes fichiers de docker vers l'hôte.

19
Saeed Masoumi

Tout d'abord, un peu d'informations sur volumes Docker . Les montages de volume se produisent uniquement au moment de la création du conteneur. Cela signifie que vous ne pouvez pas modifier les montages de volume après avoir démarré le conteneur. En outre, les montages de volume sont à sens unique: de l'hôte au conteneur, et non l'inverse. Lorsque vous spécifiez un répertoire Host monté en tant que volume dans votre conteneur (par exemple, quelque chose comme: docker run -d --name="foo" -v "/path/on/Host:/path/on/container" ubuntu), c'est un linux "régulier" mount --bind, ce qui signifie que le répertoire Host "remplacera" temporairement le répertoire conteneur. Rien n'est réellement supprimé ou écrasé sur le répertoire de destination, mais en raison de la nature des conteneurs, cela signifie effectivement qu'il sera remplacé pour la durée de vie du conteneur.

Donc, vous vous retrouvez avec deux options (peut-être trois). Vous pouvez monter un répertoire Host dans votre conteneur, puis copier ces fichiers dans votre script de démarrage (ou si vous apportez cron dans votre conteneur , vous pouvez utiliser un cron pour copier périodiquement ces fichiers sur ce volume de répertoire Host monter).

Vous pouvez également utiliser docker cp pour déplacer des fichiers de votre conteneur vers votre hôte. Maintenant, c'est un peu hacky et certainement pas quelque chose que vous devriez utiliser dans l'automatisation de votre infrastructure. Mais cela fonctionne très bien dans ce but précis. Une seule fois ou le débogage est une excellente situation pour cela.

Vous pouvez également configurer un transfert réseau, mais cela est assez complexe pour ce que vous faites. Cependant, si vous souhaitez le faire régulièrement pour vos fichiers journaux (ou autre), vous pouvez envisager d'utiliser quelque chose comme rsyslog pour déplacer ces fichiers hors de votre conteneur.

18
L0j1k

Alors, comment puis-je monter le/var/lib/myapp du conteneur sur le/var/lib/myapp dans le serveur hôte

C'est le contraire: vous pouvez monter un dossier Host sur votre conteneur sur docker run .

(sans retirer le conteneur actuel)

Je ne pense pas.
Pour le moment, vous pouvez vérifier docker inspect <containername> et voyez si vous voyez votre journal dans le /var/lib/docker/volumes/... associé au volume de votre conteneur.

Ou vous pouvez rediriger le résultat de docker logs <containername> dans un fichier Host.
Pour plus d'exemples, voir this Gist .

L'alternative serait de monter un répertoire Host en tant que dossier de journal, puis d'accéder aux fichiers journaux directement sur l'hôte.

me@Host~$ docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx dockerfile/nginx

me@Host~$ ls <log-dir> 

(encore une fois, cela s'applique à un conteneur que vous démarrez, pas à un conteneur existant)

2
VonC