Dockerfile 复制保留子目录结构

问题描述 投票:0回答:6

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

文件是这样的:

folder1/
    file1
    file2
folder2/
    file1
    file2

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

COPY files/* /files/

但是,

folder1/
folder2/
中的所有文件都直接放入
/files/
中,而不包含其文件夹:

files/
    file1
    file2

Docker 有没有办法保留子目录结构并将文件复制到其目录中?像这样:

files/
    folder1/
        file1
        file2
    folder2/
        file1
        file2
copy docker dockerfile
6个回答
740
投票

使用以下 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

94
投票

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

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

93
投票

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

FROM ubuntu
COPY . /
RUN ls -la /

12
投票

我无法得到任何对我有用的答案。我必须为当前目录添加一个点,以便工作的 docker 文件看起来像:

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

还使用

RUN ls
来验证对我来说不起作用,并且让它工作看起来确实很复杂,验证 docker 文件中内容的一种更简单的方法是运行交互式 shell 并检查其中的内容,使用
docker run -it <tagname> sh


6
投票

如果你想完全复制一个源目录,并具有相同的目录结构, 那么就不要使用星号(*)。在 Dockerfile 中写入 COPY 命令如下。

COPY . destinatio-directory/ 

0
投票

检查 Q1 2024 Dockerfile 1.7.0 版本是否支持此用例。

PR 3001确实提到:

COPY [--parents[=<boolean>]] <src>... <dest>

--parents
标志保留
src
条目的父目录。
该标志默认为
false

# syntax=docker/dockerfile-upstream:master-labs
FROM scratch

COPY ./x/a.txt ./y/a.txt /no_parents/
COPY --parents ./x/a.txt ./y/a.txt /parents/

# /no_parents/a.txt
# /parents/x/a.txt
# /parents/y/a.txt

此行为类似于 Linux

cp
实用程序的
--parents
标志。

请注意,如果没有指定

--parents
标志,任何文件名冲突都会导致 Linux
cp
操作失败,并显示明确的错误消息 (
cp: will not overwrite just-created './x/a.txt' with './y/a.txt'
),其中 Buildkit 将默默地覆盖目标处的目标文件。

虽然可以保留仅包含一个

COPY
条目的
src
指令的目录结构,但通常保持结果图像中的层数尽可能低会更有利。
因此,使用
--parents
标志,Buildkit 能够将多个
COPY
指令打包在一起,保持目录结构完整。

© www.soinside.com 2019 - 2024. All rights reserved.