Docker不添加现有文件

时间:2017-06-12 23:28:25

标签: docker cmake

我有一个简单的设置,克隆Git repo并编译二进制文件,然后将其复制到容器

Dockerfile:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y <...>

RUN git clone <REPO>

WORKDIR <REPO>/build
RUN cmake ..
RUN make install

RUN ls bin
ADD bin/binaryname /

ENTRYPOINT <...>

Docker输出:

[100%] Linking CXX executable bin/binaryname
...
 ---> 4a9c6bb40214
Removing intermediate container 00bf96c84f37
Step 7 : RUN ls bin
 ---> Running in c295c1fca462
binaryname
 ---> a418c1bfa6cd
Removing intermediate container c295c1fca462
Step 8 : ADD bin/binaryname /
lstat bin/binaryname: no such file or directory

所以基本上docker看到那个文件但是不会添加它,为什么?

2 个答案:

答案 0 :(得分:3)

删除ADD指令,它应该有效。原因如下:

所有RUN指令都发生在正在构建的映像中,而不是在本地计算机上。 ADD指令尝试将文件从主机文件系统复制到映像。由于您在映像中构建了文件bin/binaryname,因此它在主机上的bin / binaryname中不存在。它已经存在于图像中,因为它就是它的构建地点。

答案 1 :(得分:1)

如果您需要文件系统根目录下的二进制文件而不是<REPO>/build/bin下的二进制文件,请将副本作为RUN命令执行。正如Mano所提到的,ADDCOPY将从您发送到构建主机的上下文(通常是.命令末尾的docker build .目录中复制内容。但是你要做的是从容器内的一个目录复制到另一个目录。那看起来像是:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y <...>

RUN git clone <REPO>

WORKDIR <REPO>/build
RUN cmake ..
RUN make install \
 && cp bin/binaryname /

ENTRYPOINT <...>