Docker - 将文件从不同的工作目录复制到另一个工作目录不起作用

问题描述 投票:0回答:3

我正在使用:

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 映像内)?

docker copy
3个回答
18
投票

此处声明您不能使用绝对路径将文件从主机复制到容器。不支持:https://github.com/moby/moby/issues/4592。所以你必须先准备好当前目录中的所有文件。


17
投票

COPY
命令将文件从构建上下文(即示例中
.
命令末尾的
docker build
,也称为当前目录)复制到图像中。您无法将文件从构建上下文外部复制到映像中。

出于您的目的,您似乎想要在图像内的两个不同位置之间复制,而不是从构建上下文中复制。为此,只要几乎每个基本映像中都存在

cp
命令,您就可以运行:

RUN cp /usr/bin/yes /opt/

或者在 json/exec 语法中:

RUN [ "cp", "/usr/bin/yes", "/opt/" ]

请注意,exec 语法要求您将命令的每个参数分隔到单独的 json 数组条目中。 exec 语法也不会运行 shell,因此您无法执行变量扩展和 I/O 重定向等操作,而在本例中则没有执行这些操作。


0
投票

我遇到了同样的问题,经过一番尝试和错误并阅读文献后,我偶然发现了这个“ADD 和 COPY 之间的差异”链接。我决定使用 ADD 指令从 Dockerfile 目录之外的源复制文件。

与仅适用于构建上下文中的文件的 COPY 不同,ADD 允许我从不同的位置复制。

ADD /path/to/source /app

如果您尝试从 Dockerfile 目录之外的位置复制文件,那么 ADD 是最佳选择。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.