Docker-从其他工作目录到另一个工作目录的COPY文件不起作用

时间:2019-05-08 10:11:10

标签: docker copy

我正在使用:

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的{​​{1}}应用程序。但是,我想将out/下的名为"yes"的文件复制到我的/user/bin/文件夹中。

我尝试了/opt命令和COPY命令,但是都没有成功。

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

Ubuntu

我的COPY尝试:

docker run mytest ls -l /opt
total 0

我的CMD尝试:

COPY /usr/bin/yes /opt

错误:

CMD ["cp /usr/bin/yes /opt"]

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

COPY命令将文件从构建上下文(在您的示例中,即示例中的.命令的末尾,即docker build复制到映像中)中。您不能将文件从构建上下文外部复制到映像中。

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

RUN cp /usr/bin/yes /opt/

或使用json / exec语法:

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

请注意,exec语法要求您将命令的每个参数都分隔到单独的json数组条目中。 exec语法也不会在shell上运行,因此您无法执行诸如变量扩展和I / O重定向之类的操作,在这种情况下不会这样做。