我正在使用:
Docker 18.09.1
Ubuntu 16.04
我想使用
Dockerfile
将文件从 docker 映像中的特定文件夹复制到 docker 映像中的另一个文件夹。
我的
docker
命令是:
sudo docker build -t mytest .
sudo docker run mytest
我的
Dockerfile
是:
FROM ubuntu:16.04
RUN mkdir -p out/
COPY . out/ <---- this works
COPY /usr/bin/yes /opt <---- this doesn't work!!
CMD out/helloworld
我的
C++
工作文件夹中有一个名为 helloworld
的 out/
应用程序。但是,我想将 "yes"
下名为 /user/bin/
的文件复制到我的 /opt
文件夹中。
我尝试过
COPY
命令和 CMD
命令,但没有成功。
我尝试通过在我的
Ubuntu
虚拟机上运行命令来检查文件是否存在:
docker run mytest ls -l /opt
total 0
我的复制尝试:
COPY /usr/bin/yes /opt
我的CMD尝试:
CMD ["cp /usr/bin/yes /opt"]
错误:
COPY failed: stat /var/lib/docker/tmp/docker-builder737799611/usr/bin/yes: no such file or directory
两者都不起作用。如何将文件复制到另一个文件夹(在同一个 docker 映像内)?
此处声明您不能使用绝对路径将文件从主机复制到容器。不支持:https://github.com/moby/moby/issues/4592。所以你必须先准备好当前目录中的所有文件。
COPY
命令将文件从构建上下文(即示例中 .
命令末尾的 docker build
,也称为当前目录)复制到图像中。您无法将文件从构建上下文外部复制到映像中。
出于您的目的,您似乎想要在图像内的两个不同位置之间复制,而不是从构建上下文中复制。为此,只要几乎每个基本映像中都存在
cp
命令,您就可以运行:
RUN cp /usr/bin/yes /opt/
或者在 json/exec 语法中:
RUN [ "cp", "/usr/bin/yes", "/opt/" ]
请注意,exec 语法要求您将命令的每个参数分隔到单独的 json 数组条目中。 exec 语法也不会运行 shell,因此您无法执行变量扩展和 I/O 重定向等操作,而在本例中则没有执行这些操作。
我遇到了同样的问题,经过一番尝试和错误并阅读文献后,我偶然发现了这个“ADD 和 COPY 之间的差异”链接。我决定使用 ADD 指令从 Dockerfile 目录之外的源复制文件。
与仅适用于构建上下文中的文件的 COPY 不同,ADD 允许我从不同的位置复制。
ADD /path/to/source /app
如果您尝试从 Dockerfile 目录之外的位置复制文件,那么 ADD 是最佳选择。希望这有帮助!