我试图从我的本地主机复制一些文件和文件夹到一个docker映像构建。

文件是这样的:

folder1/
    file1
    file2
folder2/
    file1
    file2

我试着像这样复制:

COPY files/* /files/

然而,所有来自folder1/和folder2/的文件都直接放在/files/中,没有它们的文件夹:

files/
    file1
    file2

在Docker中是否有一种方法来保持子目录结构以及将文件复制到它们的目录?是这样的:

files/
    folder1/
        file1
        file2
    folder2/
        file1
        file2

当前回答

或者你也可以用"."代替*,因为这将获取工作目录下的所有文件,包括文件夹和子文件夹:

FROM ubuntu
COPY . /
RUN ls -la /

其他回答

用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

或者你也可以用"."代替*,因为这将获取工作目录下的所有文件,包括文件夹和子文件夹:

FROM ubuntu
COPY . /
RUN ls -la /

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

COPY ./local-path/. /image-path/

这些答案对我都没用。我必须为当前目录添加一个点,这样工作的docker文件看起来就像:

FROM ubuntu 
WORKDIR /usr/local
COPY files/ ./files/

此外,使用RUN ls来验证对我来说并不管用,让它工作看起来真的很复杂,一个更简单的方法来验证docker文件中的内容是运行一个交互式shell,并检查其中有什么,使用docker RUN -it <tagname> sh。

如果要完全复制具有相同目录结构的源目录, 那就不要用*号。在Dockerfile中写COPY命令,如下所示。

COPY . destinatio-directory/