Docker - 将文件从不同的工作目录复制到另一个目录无法正常工作

15

我正在使用:

Docker 18.09.1
Ubuntu 16.04

我希望能够使用Dockerfile将一个特定文件夹中的文件复制到另一个文件夹中。这些是我的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

我有一个名为helloworld的应用程序,位于我的out/工作文件夹中。然而,我想将位于/user/bin/下的名为"yes"的文件复制到我的/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镜像中)?


你是想将文件从主机复制到镜像中,还是在镜像内部的两个目录之间进行复制? - BMitch
在镜像内的两个目录之间 - waas1919
2个回答

17

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


1
通过使用:COPY /usr/bin/yes /opt/ 我得到了错误: COPY 失败:stat /var/lib/docker/tmp/docker-builder737799611/usr/bin/yes: 没有那个文件或目录。 - waas1919
谢谢,但这不是我需要的。 我不想从我的虚拟机复制文件到Docker镜像中。 我只想在我的Docker镜像文件系统之间复制文件。 - waas1919
1
是的,但问题已关闭且不支持绝对路径:https://github.com/moby/moby/issues/4592 - nivhty
那就是答案。您能否将其作为答案写下来,以便我可以关闭此线程? - waas1919

14

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

对于您的目的,似乎您想要在镜像内部的两个不同位置之间进行复制,而根本不涉及构建上下文。对于这种情况,只要几乎每个基础映像中都有cp命令,您可以运行:

RUN cp /usr/bin/yes /opt/

或者按照json/exec语法:

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

请注意,exec语法要求您将命令和每个参数分别放入单独的JSON数组条目中。exec语法也不会运行shell,因此您无法执行变量扩展和I / O重定向等操作,在这种情况下不需要进行这些操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接