使用ADD命令将目录复制到Docker的其他目录


382

我已经阅读了http://docs.docker.com/engine/reference/builder/#add,但是遇到了问题。我想将本地目录复制go到docker/user/local/

我试过了:

ADD go /usr/local/

和:

ADD /go/ /usr/local/ 

也:

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

但是,我看到以下错误消息,/usr/local/go/src/make.bash: No such file or directory但是本地go目录中确实包含make.bash

Answers:


704
ADD go /usr/local/

会将本地目录的内容复制到docker映像目录中。go/usr/local/

复制使用中的go目录本身/usr/local/

ADD go /usr/local/go

要么

COPY go /usr/local/go

43
我正在尝试使用ADD的多源版本,因此无法为目标指定目标目录名称。有没有一种方法可以执行OP要求的多src格式(即,无需ADD为每个源目录创建一个层)?
古斯,2015年

9
我只是想通过说$HOME~或任何其他shell变量不起作用来为此添加一个旁注。我之所以这样说,是因为我花了很多钱试图解决这个问题,尽管这对大多数人来说都是显而易见的。
尖叫

34
COPY / usr / local / go对我不起作用。不复制。
Tyguy15年

78
这确实是一个令人困惑的问题。为什么不能COPY简单地表现像cp?相反,需要有一个额外的警察,它如何工作。
Zelphir Kaltstahl'3

14
.dockerignore文件可以隐藏目录,而COPY或ADD对于所列项目将不起作用
Vereb

49

事实上,ADD go /usr/local/将新增内容go文件夹,而不是文件夹本身,你可以使用Thomasleveil解决方案,或者如果没有工作,由于某种原因,你可以改变WORKDIR,以/usr/local/再加入您的目录像:

WORKDIR /usr/local/
COPY go go/

要么

WORKDIR /usr/local/go
COPY go ./

但是,如果您想添加多个文件夹,那么那样添加它们将很烦人,目前,从我当前的问题来看,目前唯一的解决方案是使用COPY . .并排除其中的所有不需要的目录和文件.dockerignore,假设我有文件夹和文件:

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

我想补充一下src assets package.json justforfun go

在Dockerfile中:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

在.dockerignore文件中:

node_modules
headache.lock
tmp
dist

或者为了获得更多乐趣(或者您想使更多的人感到困惑,也使他们受苦:P)可以是:

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

这样,您将忽略所有内容,但仅从“忽略列表”中排除要复制或添加的内容。

这是一个较晚的答案,但是增加了更多的方法来执行相同的操作,甚至可以覆盖更多的情况。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.