web-dev-qa-db-fra.com

Comment utiliser les instructions COPIER / AJOUTER de Docker pour copier un seul fichier dans une image

J'essaie de copier un seul fichier de la racine du contexte de construction dans un répertoire nouvellement créé dans une image docker.

Le Dockerfile que j'utilise est le suivant:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app

Le fichier test.txt est un simple fichier texte ASCII comme suit:

$ cat test.txt 
This is a test

Cependant, lorsque je crée cette image, j'obtiens une image indiquant que le chemin de destination n'est pas un répertoire.

$ docker build .
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:latest
 ---> 9a61b6b1315e
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 86bd44a8776e
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> ed6771adc681
Step 3 : ADD test.txt /usr/src/app
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory

J'ai essayé d'utiliser plusieurs combinaisons de versions de docker, d'images de base et de distributions avec docker installé. J'ai également essayé d'utiliser ADD au lieu de COPY mais le résultat est le même.

J'essaie actuellement cela sur CentOS 7 avec la version docker suivante installée:

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/AMD64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/AMD64

Ce que j'ai remarqué, c'est que je peux copier un répertoire, mais pas un fichier. Par exemple, si je crée un répertoire "test" dans la racine du contexte de construction et que je mets test.txt dans le répertoire test, je peux copier le répertoire avec succès:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app

Notez que dans le Dockerfile ci-dessus, je copie l'intégralité du répertoire ./test plutôt que juste ./test.txt. Cette construction a réussi.

Le documentation Docker a l'exemple d'utilisation suivant pour l'instruction COPY qui est similaire à ce que j'essaie de faire:

COPY hom?.txt /mydir/

Quelqu'un peut-il indiquer ce que je fais mal? Comment puis-je copier un seul fichier?

22
Andrew Butler

Comme indiqué dans la documentation Dockerfile:

  • Si <src> Est un autre type de fichier, il est copié individuellement avec ses métadonnées. Dans ce cas, si <dest> Se termine par une barre oblique de fin /, Il sera considéré comme un répertoire et le contenu de <src> Sera écrit dans <dest>/base(<src>) .

  • Si <dest> Ne se termine pas par une barre oblique finale, il sera considéré comme un fichier normal et le contenu de <src> Sera écrit dans <dest>.

Ainsi, vous devez écrire COPY test.txt /usr/src/app/ Avec un / De fin.

28
jwodder

Pour moi, j'ajoutais un chemin basé sur le docker-compose.yml au lieu de Dockerfile:

Structure des fichiers

.
..
/docker-compose.yml
/docker/
/docker/php/
/docker/php/Dockerfile
/docker/php/my_file

et en / Je courais docker-compose up --build.

au lieu de COPY docker/php/my_file /some/location Je devais exécuter COPY my_file /some/location

0
Steve Tauber