web-dev-qa-db-fra.com

Échec de l'instruction Dockerfile COPY?

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?

15
GG_Python

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.

17
kojiro

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.

10
Javier Castellanos

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

5
Robert Brooker