Copie o diretório para outro diretório no Docker usando o comando ADD

382

Eu li http://docs.docker.com/engine/reference/builder/#add, mas encontrei um problema. Quero copiar o diretório local gopara o docker/user/local/

Eu tentei:

ADD go /usr/local/

e:

ADD /go/ /usr/local/ 

Além disso:

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

No entanto, vejo a seguinte mensagem de erro, /usr/local/go/src/make.bash: No such file or directorymas o godiretório local contém make.bash.

pengwang
fonte

Respostas:

704
ADD go /usr/local/

copiará o conteúdo do seu godiretório local no /usr/local/diretório da sua imagem do Docker.

Para copiar o go próprio diretório em /usr/local/uso:

ADD go /usr/local/go

ou

COPY go /usr/local/go
Thomasleveil
fonte
43
Estou tentando usar a versão de várias fontes do ADD e, portanto, não posso especificar o nome do diretório de destino para o destino. Existe uma maneira de fazer o que o OP pediu em um formato multi-src (ou seja, sem criar uma ADDcamada para cada diretório de origem)?
Guss 26/05
9
Eu só quero adicionar um sidenote a isso dizendo que $HOMEou ~ou qualquer outra variável shell não vai funcionar. Estou dizendo isso porque gastei uma boa quantia tentando descobrir isso do que gostaria de admitir, apesar de ser óbvio para a maioria.
grito
34
COPY go / usr / local / go não funciona para mim. Não copia.
precisa saber é o seguinte
78
Este é realmente um assunto bastante confuso. Por que COPYsimplesmente não pode se comportar assim cp? Em vez disso, é preciso haver uma polícia extra como ela funciona.
Zelphir Kaltstahl
14
O arquivo .dockerignore pode ocultar um diretório e COPY ou ADD não funcionará nos itens listados
Vereb
49

Na verdade, ADD go /usr/local/você adicionará o conteúdo da gopasta e não a própria pasta, você pode usar a solução Thomasleveil ou, se por algum motivo não funcionar, pode alterar WORKDIRpara /usr/local/adicionar o diretório a ele como:

WORKDIR /usr/local/
COPY go go/

ou

WORKDIR /usr/local/go
COPY go ./

Mas se você quiser adicionar várias pastas, será irritante adicioná-las dessa maneira, a única solução por enquanto, no meu caso atual, é usar COPY . .e excluir todos os diretórios e arquivos indesejados .dockerignore, digamos que tenho pastas e arquivos :

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

e eu quero adicionar src assets package.json justforfun goassim:

no Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

no arquivo .dockerignore:

node_modules
headache.lock
tmp
dist

Ou para mais diversão (ou você gosta de confundir, mais pessoas as fazem sofrer também: P) pode ser:

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

Dessa forma, você ignora tudo, mas exclui o que deseja que seja copiado ou adicionado apenas da "lista de ignorados".

É uma resposta tardia, mas adicionamos mais maneiras de fazer o mesmo, cobrindo ainda mais casos.

Al-Mothafar
fonte
12

Você pode usar COPY. Você precisa especificar o diretório explicitamente. Não será criado por si só

COPY go /usr/local/go

Referência: referência do Docker CP

Amstel D'Almeida
fonte