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

waa*_*919 2 copy docker

我正在使用:

Docker 18.09.1
Ubuntu 16.04
Run Code Online (Sandbox Code Playgroud)

我想使用Dockerfile.

我的docker命令是:

sudo docker build -t mytest .
sudo docker run mytest
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

我在我的工作文件夹上C++调用helloworld了一个应用程序out/。但是,我想将一个名为"yes"which的文件复制/user/bin/到我的/opt文件夹中。

我已经尝试了COPY命令和CMD命令,但没有成功。

我试图通过在我的UbuntuVM上运行命令来检查文件是否存在:

docker run mytest ls -l /opt
total 0
Run Code Online (Sandbox Code Playgroud)

我的 COPY 尝试:

COPY /usr/bin/yes /opt
Run Code Online (Sandbox Code Playgroud)

我的 CMD 尝试:

CMD ["cp /usr/bin/yes /opt"]
Run Code Online (Sandbox Code Playgroud)

错误:

COPY failed: stat /var/lib/docker/tmp/docker-builder737799611/usr/bin/yes: no such file or directory
Run Code Online (Sandbox Code Playgroud)

两者都不起作用。如何将文件复制到另一个文件夹(在同一个 docker 映像内)?

BMi*_*tch 14

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

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

RUN cp /usr/bin/yes /opt/
Run Code Online (Sandbox Code Playgroud)

或者在 json/exec 语法中:

RUN [ "cp", "/usr/bin/yes", "/opt/" ]
Run Code Online (Sandbox Code Playgroud)

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


niv*_*hty 6

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