如何从Dockerfile将文件夹复制到docker镜像?

jon*_*alv 28 docker dockerfile

我在Dockerfile中尝试了以下命令:COPY * /并且对结果感到非常惊讶.似乎天真的docker代码遍历glob中的目录,然后将每个文件转储到目标目录中,同时忽略我的目录结构.

至少这就是我理解这张票的方式,它肯定对应于我得到的结果.

我想这种行为仍然存在的唯一原因必须是应该采取其他一些方法.但对于一只脑力很小的熊来说,了解如何,有谁知道呢?

Bal*_*i M 13

就像@Vonc所说,没有可能像现在这样添加命令.唯一的解决方法是提及文件夹,创建它并向其中添加内容.

# add contents to folder
ADD src $HOME/src
Run Code Online (Sandbox Code Playgroud)

将在您的目录中创建一个名为src的文件夹,并将文件夹src的内容添加到此文件夹中.


Mik*_*hva 13

我不完全理解原始海报的情况,但我可以证明可以使用 Dockerfile 中的 COPY 复制目录结构。

假设您有以下文件夹结构:

folder1
  file1.html
  file2.html
folder2
  file3.html
  file4.html
  subfolder
    file5.html
    file6.html
Run Code Online (Sandbox Code Playgroud)

要将其复制到目标映像,您可以使用这样的 Dockerfile 内容:

FROM nginx

COPY ./folder1/ /usr/share/nginx/html/folder1/
COPY ./folder2/ /usr/share/nginx/html/folder2/

RUN ls -laR /usr/share/nginx/html/*
Run Code Online (Sandbox Code Playgroud)

输出结果docker build .如下:

$ docker build --no-cache .
Sending build context to Docker daemon  9.728kB
Step 1/4 : FROM nginx
 ---> 7042885a156a
Step 2/4 : COPY ./folder1/ /usr/share/nginx/html/folder1/
 ---> 6388fd58798b
Step 3/4 : COPY ./folder2/ /usr/share/nginx/html/folder2/
 ---> fb6c6eacf41e
Step 4/4 : RUN ls -laR /usr/share/nginx/html/*
 ---> Running in face3cbc0031
-rw-r--r-- 1 root root  494 Dec 25 09:56 /usr/share/nginx/html/50x.html
-rw-r--r-- 1 root root  612 Dec 25 09:56 /usr/share/nginx/html/index.html

/usr/share/nginx/html/folder1:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file1.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file2.html

/usr/share/nginx/html/folder2:
total 20
drwxr-xr-x 3 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file3.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file4.html
drwxr-xr-x 2 root root 4096 Jan 16 10:33 subfolder

/usr/share/nginx/html/folder2/subfolder:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:33 .
drwxr-xr-x 3 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file5.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file6.html
Removing intermediate container face3cbc0031
 ---> 0e0062afab76
Successfully built 0e0062afab76
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 10

您的机票中所述:

你有COPY files/* /test/扩展到COPY files/dir files/file1 files/file2 files/file /test/.
如果将其拆分为单独的COPY命令(例如COPY files/dir /test/),您将看到(无论好坏)COPY将每个arg的内容复制dir到目标目录中.不是arg dir本身,而是内容.

我并不为COPY不保留顶级目录这一事实而感到激动,但现在已经有一段时间了.

所以在保留向后兼容性的名义下,不可能是COPY/ ADD目录结构.

唯一的解决方法是RUN mkdir -p /x/y/z构建目标目录结构,然后是一系列docker ADD(每个要填充的文件夹一个).
(ADD不是COPY,根据评论)

  • 解决方法是正确使用“ ADD”。我试图在下面的答案中阐明用法。 (2认同)
  • COPY 做不到,但 ADD 可以。这个答案具有误导性,因为建议是手动创建结构而不是使用 ADD。根据@ryanrain,可以添加文件夹和内容。我已经成功地通过ADD(但不是COPY)做到了这一点。我建议更新此答案或将其删除。 (2认同)

rya*_*ain 9

使用ADD(docs)

ADD命令可以作为<src>参数接受:

  1. build文件夹的文件夹(与Dockerfile相同的文件夹).然后,您将在Dockerfile中添加一行,如下所示: ADD folder /path/inside/your/container

要么

  1. 主机文件系统中任何位置的单文件存档.要创建存档,请使用以下命令: tar -cvzf newArchive.tar.gz /path/to/your/folder 然后,您可以在Dockerfile中添加一行,如下所示: ADD /path/to/archive/newArchive.tar.gz /path/inside/your/container

笔记:

  • ADD 将自动提取您的存档.
  • 是否存在尾部斜杠很重要,请参阅链接的文档

  • 谢谢你,先生。优秀的解决方案。我通过 trail &amp; error 发现的唯一奇怪的事情是容器路径应该反映文件夹名称。例如,添加 myFolder /container/myFolder ,然后 myFolder 及其内容将位于预期的位置。 (2认同)
  • 我无法强调第 1 点中“ADD”的第一个参数_必须位于构建文件夹内_的重要性。 (2认同)

Kla*_*aus 8

COPY . <destination>

在你的情况下:

COPY . /

  • [确实](https://github.com/moby/moby/issues/15858#issuecomment-330511914):不要使用`COPY * /app`,它不会做你期望它做的事情。使用`复制。/app` 而是保留目录树。 (2认同)

Hin*_*han 5

使用ADD代替COPY。假设您要将目录src中的所有内容从主机复制到容器中的目录dst:

ADD src dst
Run Code Online (Sandbox Code Playgroud)

注意:b将在容器中自动创建。

  • 什么是“ b”?https://github.com/docker/docker/issues/18396建议ADD不创建子文件夹。 (7认同)
  • 你的答案不清楚,但我可以明白你想说的要点并找出我上面的答案。效果很好。 (3认同)