我有一个简单的设置,克隆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看到那个文件但是不会添加它,为什么?
答案 0 :(得分:3)
删除ADD
指令,它应该有效。原因如下:
所有RUN
指令都发生在正在构建的映像中,而不是在本地计算机上。 ADD
指令尝试将文件从主机文件系统复制到映像。由于您在映像中构建了文件bin/binaryname
,因此它在主机上的bin / binaryname中不存在。它已经存在于图像中,因为它就是它的构建地点。
答案 1 :(得分:1)
如果您需要文件系统根目录下的二进制文件而不是<REPO>/build/bin
下的二进制文件,请将副本作为RUN
命令执行。正如Mano所提到的,ADD
和COPY
将从您发送到构建主机的上下文(通常是.
命令末尾的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 <...>