【问题标题】:Dockerfile copy keep subdirectory structureDockerfile拷贝保持子目录结构
【发布时间】:2015-07-24 19:12:21
【问题描述】:

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

文件是这样的:

folder1
    file1
    file2
folder2
    file1
    file2

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

COPY files/* /files/

但是,所有文件都放在 /files/ 中,Docker 中有没有办法保留子目录结构以及将文件复制到它们的目录中?

【问题讨论】:

  • 您能说明一下您得到了什么结果以及您期望什么结果吗?
  • 是的,我同意,@Thomasleveil。答案很清楚,但问题不是。

标签: copy docker dockerfile


【解决方案1】:

使用此 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

【讨论】:

  • 但是如果我只需要像COPY files/*1 /files/这样的文件呢?
  • 这是否也会覆盖该目录中的现有文件?
  • @chander,是的,现有文件将被覆盖
  • 重要的是要注意这里的秘诀是有一个源目录和一个目标目录。任何其他组合都会将源目录的内容复制到目标目录。
  • 在 macos 上从 ibmcom/websphere-liberty:kernel-java8-ibmjava-ubi 构建时,这对我不起作用。这篇文章中的其他解决方案都没有。
【解决方案2】:

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

FROM ubuntu
COPY . /
RUN ls -la /

【讨论】:

  • 会包含隐藏文件和 '.git' 目录之类的目录吗?
  • @BrunoNegrãoZica,您可以使用 .dockerignore 文件来指定您希望在复制操作期间忽略哪些文件/文件夹。来晚了,希望对其他人有所帮助
  • COPY . ./ 为我工作,而不是使用 Docker Desktop 4.0.1 的 COPY . /
【解决方案3】:

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

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

【讨论】:

  • 这是最好的解决方案,因为在一个命令中,您可以将整个文件系统的更改复制到映像层中。我在我的源代码库中保留了一个/resources 目录,它反映了要添加/覆盖的图像文件系统的部分。然后一次性全部添加:COPY resources/./ /
【解决方案4】:

如果您想完全复制具有相同目录结构的源目录, 然后不要使用星号(*)。如下在 Dockerfile 中编写 COPY 命令。

COPY . destinatio-directory/ 

【讨论】:

  • OP 专门询问当前目录中的目录,而不是当前目录的内容。 COPY files/ /files/ 没有通配符就是答案。
猜你喜欢
  • 2022-01-15
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多