Copiez le répertoire dans un autre répertoire de Docker à l'aide de la commande ADD

382

J'ai lu http://docs.docker.com/engine/reference/builder/#add mais j'ai rencontré un problème. Je veux copier le répertoire local gosur Docker/user/local/

J'ai essayé:

ADD go /usr/local/

et:

ADD /go/ /usr/local/ 

aussi:

RUN chmod 0755 /usr/local/go/src/make.bash

Cependant, je vois le message d'erreur suivant /usr/local/go/src/make.bash: No such file or directorymais le gorépertoire local contient make.bash.

pengwang
la source

Réponses:

704
ADD go /usr/local/

copiera le contenu de votre gorépertoire local dans le /usr/local/répertoire de votre image Docker.

Pour copier le gorépertoire lui-même en cours d' /usr/local/utilisation:

ADD go /usr/local/go

ou

COPY go /usr/local/go
Thomasleveil
la source
43
J'essaie d'utiliser la version à sources multiples d'ADD, et je ne peux donc pas spécifier le nom du répertoire cible pour la destination. Existe-t-il un moyen de faire ce que l'OP a demandé dans un format multi-src (c'est-à-dire sans créer de ADDcouche pour chaque répertoire source)?
Guss
9
Je veux juste ajouter un sidenote à cela en disant que $HOMEou ~ou toute autre variable shell ne fonctionnera pas. Je dis cela parce que j'ai passé beaucoup de temps à essayer de comprendre cela que je ne voudrais l'admettre, même si c'est évident pour la plupart.
hurlement du
34
COPY go / usr / local / go ne fonctionne pas pour moi. Ne copie pas.
Tyguy7
78
C'est vraiment une question assez déroutante. Pourquoi ne peut-il pas COPYsimplement se comporter comme cp? Au lieu de cela, il doit y avoir une police supplémentaire pour savoir comment cela fonctionne.
Zelphir Kaltstahl
14
Le fichier .dockerignore peut masquer un répertoire et COPIER ou AJOUTER ne fonctionnera pas pour les éléments listés
Vereb
49

En effet ADD go /usr/local/, ajoutera le contenu du godossier et non le dossier lui-même, vous pouvez utiliser la solution Thomasleveil ou si cela n'a pas fonctionné pour une raison quelconque, vous pouvez changer WORKDIRpour /usr/local/ensuite y ajouter votre répertoire comme:

WORKDIR /usr/local/
COPY go go/

ou

WORKDIR /usr/local/go
COPY go ./

Mais si vous voulez ajouter plusieurs dossiers, il sera ennuyeux de les ajouter comme ça, la seule solution pour l'instant, comme je le vois dans mon problème actuel, utilise COPY . .et exclut tous les répertoires et fichiers indésirables dans .dockerignore, disons que j'ai des dossiers et des fichiers :

- src 
- tmp 
- dist 
- assets 
- go 
- justforfun 
- node_modules 
- scripts 
- .dockerignore 
- Dockerfile 
- headache.lock 
- package.json 

et je veux ajouter src assets package.json justforfun goceci:

dans Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

dans le fichier .dockerignore:

node_modules
headache.lock
tmp
dist

Ou pour plus de plaisir (ou si vous aimez confondre plus de gens, faites-les souffrir également: P) peut être:

*
!src 
!assets 
!go 
!justforfun 
!scripts 
!package.json 

De cette façon, vous ignorez tout, mais en excluant ce que vous souhaitez copier ou ajouter uniquement à partir de "ignorer la liste".

C'est une réponse tardive, mais en ajoutant plus de façons de faire de même en couvrant encore plus de cas.

Al-Mothafar
la source
12

Vous pouvez utiliser COPY. Vous devez spécifier le répertoire explicitement. Il ne sera pas créé par lui-même

COPY go /usr/local/go

Référence: Docker CP reference

Amstel D'Almeida
la source