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

时间:2016-06-13 12:34:22

标签: docker dockerfile

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

至少这是我理解this ticket的方式,它肯定对应于我得到的结果。

我认为这种行为仍然存在的唯一原因必须是应该采取其他方式。但对于一只脑力很小的熊来说,了解怎么样,有人知道吗?

10 个答案:

答案 0 :(得分:10)

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

# add contents to folder
ADD src $HOME/src

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

答案 1 :(得分:9)

作为mentioned in your ticket

  

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,根据评论)

答案 2 :(得分:7)

使用ADDdocs

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

  1. 构建文件夹内的一个文件夹 (与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将自动提取您的存档。
  • 是否存在斜杠很重要,请参阅链接的文档

答案 3 :(得分:3)

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

ADD src dst

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

答案 4 :(得分:3)

用/

替换*

所以而不是

COPY * <destination>

使用

COPY / <destination>

答案 5 :(得分:2)

COPY . <destination>

在您的情况下:

COPY . /

答案 6 :(得分:0)

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

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

folder1
  file1.html
  file2.html
folder2
  file3.html
  file4.html
  subfolder
    file5.html
    file6.html

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

FROM nginx

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

RUN ls -laR /usr/share/nginx/html/*

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

答案 7 :(得分:0)

FROM openjdk:8-jdk-alpine RUN apk update && apk add wget openssl lsof procps curl RUN apk update RUN mkdir -p /apps/agent RUN mkdir -p /apps/lib ADD ./app/agent /apps/agent ADD ./app/lib /apps/lib ADD ./app/* /apps/app/ RUN ls -lrt /apps/app/ CMD sh /apps/app/launch.sh

通过使用DockerFile,我将代理和lib目录复制到/ apps / agent,/ apps / lib目录以及要锁定的文件堆中。

答案 8 :(得分:-1)

最简单的方法:

sudo docker cp path/on/your/machine adam_ubuntu:/root/path_in_container

如果要复制需要使用〜的根文件,请注意放入 root 路径。

答案 9 :(得分:-1)

假设您要将内容从具有docker文件的文件夹复制到容器中。 使用添加:

RUN mkdir /temp
ADD folder /temp/Newfolder  

它将使用temp / newfolder添加到您的容器中

文件夹是您拥有dockerfile的文件夹/目录,更具体地说,是您放置内容并要复制该文件的目录。

现在您可以通过运行容器检查复制/添加的文件夹并使用ls查看内容