我在我的Dockerfile中尝试了以下命令:COPY * /
并且对结果感到非常惊讶。似乎天真的docker代码遍历glob中的目录,然后将每个文件转储到目标目录中,同时忽略我的目录结构。
至少这是我理解this ticket的方式,它肯定对应于我得到的结果。
我认为这种行为仍然存在的唯一原因必须是应该采取其他方式。但对于一只脑力很小的熊来说,了解怎么样,有人知道吗?
答案 0 :(得分:10)
就像@Vonc所说,没有可能像现在这样添加命令。唯一的解决方法是提及文件夹,创建文件夹并向其中添加内容。
# add contents to folder
ADD src $HOME/src
将在您的目录中创建一个名为 src 的文件夹,并将文件夹 src 的内容添加到此文件夹中。
答案 1 :(得分:9)
您
COPY files/* /test/
扩展为COPY files/dir files/file1 files/file2 files/file /test/
如果您将其拆分为单独的COPY
命令(例如COPY files/dir /test/
),您会看到(无论好坏)COPY
将复制每个arg的内容dir
进入目标目录。不是argdir
本身,而是内容。我对COPY没有保留顶级目录的事实并不感到兴奋,但现在已经这样了。
所以在保留向后兼容性的名义下,COPY
/ ADD
目录结构是不可能的。
唯一的解决方法是构建目标目录结构的一系列RUN mkdir -p /x/y/z
,然后是一系列docker ADD
(每个要填充的文件夹一个)。
(ADD
,而不是COPY
,根据评论)
答案 2 :(得分:7)
ADD
(docs) ADD
命令可以接受为<src>
参数:
ADD folder /path/inside/your/container
或
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查看内容