Tous, j'essaie de copier de manière persistante des fichiers de mon hôte vers une image afin que ces fichiers soient disponibles avec chaque conteneur lancé en fonction de cette image. Fonctionnant sur Debian Wheezy 64bit en tant qu'invité Virtualbox.
le Dockerfile est assez simple (installation d'une image d'octave):
FROM debian:jessie
MAINTAINER GG_Python <[redacted]@gmail.com>
RUN apt-get update
RUN apt-get update
RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics
RUN mkdir /octave
RUN mkdir /octave/libs
RUN mkdir /octave/libs/jsonlab
COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.
J'obtiens la trace suivante après avoir émis une commande de génération: docker build -t octave .
Sending build context to Docker daemon 423.9 kB
Sending build context to Docker daemon
Step 0 : FROM debian:jessie
---> 58052b122b60
Step 1 : MAINTAINER GG_Python <[..]@gmail.com>
---> Using cache
---> 90d2dd2f7ee8
Step 2 : RUN apt-get update
---> Using cache
---> 4c72c25cd829
Step 3 : RUN apt-get update
---> Using cache
---> b52f0bcb9f86
Step 4 : RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics
---> Using cache
---> f0637ab96d5e
Step 5 : RUN mkdir /octave
---> Using cache
---> a2d278b2819b
Step 6 : RUN mkdir /octave/libs
---> Using cache
---> 65efbbe01c99
Step 7 : RUN mkdir /octave/libs/jsonlab
---> Using cache
---> e41b80901266
Step 8 : COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.
INFO[0000] ~/octave/jsonlab/loadjson.m: no such file or directory
Docker refuse absolument de copier ce fichier de l'hôte dans l'image. Inutile de dire que le fichier loadjson.m est là (affichages cat), toutes mes tentatives pour changer le chemin (relatif, absolu, etc.) ont échoué. Un conseil pourquoi cette tâche simple est problématique?
Au moment où j'ai écrit ceci, Docker n'a pas développé ~ ou $ HOME. Maintenant, il fait quelques extensions dans le contexte de construction, mais même si elles ne sont probablement pas ce que vous voulez, elles ne sont pas votre répertoire personnel en dehors du contexte. Vous devez référencer le fichier explicitement ou le regrouper par rapport au Dockerfile lui-même.
Docker ne peut copier que des fichiers à partir du contexte, du dossier dans lequel vous vous trouvez moins tout fichier répertorié dans le fichier dockerignore.
Lorsque vous exécutez "docker build", docker tarit le contexte et l'envoie au démon docker auquel vous êtes connecté. Il vous permet uniquement de copier des fichiers à l'intérieur du contexte car le démon peut être une machine distante.
Je n'ai pas pu faire fonctionner COPY avant d'avoir compris le contexte (j'essayais de copier un fichier en dehors du contexte)
La commande docker build crée une image à partir d'un Dockerfile et d'un contexte. Le contexte de la construction est les fichiers à un emplacement spécifié PATH. Le PATH est un répertoire de votre système de fichiers local.
Un contexte est traité récursivement. Ainsi, un CHEMIN comprend tous les sous-répertoires.
La génération est exécutée par le démon Docker, pas par la CLI. La première chose qu'un processus de construction fait est d'envoyer le contexte entier (récursivement) au démon. Dans la plupart des cas, il est préférable de commencer avec un répertoire vide comme contexte et de conserver votre Dockerfile dans ce répertoire. Ajoutez uniquement les fichiers nécessaires à la création du Dockerfile.
Avertissement: N'utilisez pas votre répertoire racine, /, comme CHEMIN car il provoque le transfert de l'intégralité du contenu de votre disque dur par le build vers le démon Docker.
Référence: https://docs.docker.com/engine/reference/builder/#usage