Dockerfile复制保持子目录结构


254

我正在尝试将多个文件和文件夹从本地主机复制到Docker映像构建中。

这些文件是这样的:

folder1
    file1
    file2
folder2
    file1
    file2

我正在尝试像这样制作副本:

COPY files/* /files/

但是,所有文件都放在/ files /中,Docker中是否可以保留子目录结构以及将文件复制到其目录中?


1
您能否澄清一下您得到了什么结果以及您期望得到什么结果?
Thomasleveil

Answers:


410

使用以下Dockerfile从COPY中删除星号:

FROM ubuntu
COPY files/ /files/
RUN ls -la /files/*

结构在那里:

$ docker build .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> d0955f21bf24
Step 1 : COPY files/ /files/
 ---> 5cc4ae8708a6
Removing intermediate container c6f7f7ec8ccf
Step 2 : RUN ls -la /files/*
 ---> Running in 08ab9a1e042f
/files/folder1:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2

/files/folder2:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2
 ---> 03ff0a5d0e4b
Removing intermediate container 08ab9a1e042f
Successfully built 03ff0a5d0e4b

64
但是,如果我只需要一些文件COPY files/*1 /files/怎么办?
帕维尔·阿加科夫

1
这还会覆盖该目录中的现有文件吗?
chander

1
@chander,是的,现有文件将被覆盖
-ISanych

4
重要的是要注意,这里的秘密之处在于有一个源目录和一个目标目录。任何其他组合都将源目录的内容复制到目标目录。
马辛

我无法RUN ls -la /files/*直接从的控制台输出中看到的输出docker build。因此,我改为直接通过ssh进入容器,ls直接在主机上进行操作,使用docker exec -it <container name> /bin/bash
昵称

31

或者,您可以使用“。” 而不是*,因为这将占用工作目录中的所有文件,包括文件夹和子文件夹:

FROM ubuntu
COPY . /
RUN ls -la /

1
包括隐藏文件和目录“ .git”之类的目录吗?
布鲁诺·内格罗·齐卡(BrunoNegrãoZica)

7
@BrunoNegrãoZica,您可以使用.dockerignore文件来指定要在复制操作期间忽略的文件/文件夹。已经晚了,但希望对其他人有所帮助
Hellaren

20

要将本地目录合并到映像中的目录中,请执行此操作。它不会删除图像中已经存在的文件。它只会添加本地存在的文件,如果已经存在相同名称的文件,则会覆盖映像中的文件。

COPY ./files/. /files/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.