【问题标题】:Dockerfile- Reduce layers by Copying in a single statementDockerfile - 通过在单个语句中复制来减少层数
【发布时间】:2021-10-30 17:56:16
【问题描述】:

目前,在我的 dockerfile 中,我使用多个 COPY 命令从我的存储库中复制目录。

  • 复制 requirements.txt requirements.txt
  • 复制验证 /opt/validation
  • 复制模板 /opt/templates
  • 复制 goss /opt/goss
  • 复制 newman /opt/newman
  • 复制 conftest.py /opt/validation/conftest.py

如何使用单个 COPY 命令获得与上述相同的结果。有什么办法吗?

【问题讨论】:

  • 减少层数并没有什么特别的好处,除了有一个你不太可能遇到的相对较大的限制,这有点像在一个句子中写很多单词而不是打破它分成几个,所以除非你遇到一个特定的问题,或者你实际上达到了 127 层的限制,你现在拥有它的方式可能很好,我就让它保持原样。跨度>

标签: docker dockerfile copy


【解决方案1】:

如果你只是想把东西复制到同一个文件夹/opt,也许只需使用next:

文件夹结构:

.
├── conftest.py
├── Dockerfile
├── .dockerignore
├── goss
├── newman
├── requirements.txt
├── templates
└── validation

Dockerfile:

FROM alpine
COPY . /opt
#RUN mv /opt/conftest.py /opt/validation
RUN ls /opt

.dockerignore:

Dockerfile

执行:

$ docker build -t abc:1 . --no-cache
Sending build context to Docker daemon  6.144kB
Step 1/3 : FROM alpine
 ---> 28f6e2705743
Step 2/3 : COPY . /opt
 ---> 8beb53be958c
Step 3/3 : RUN ls /opt
 ---> Running in cfc9228124fb
conftest.py
goss
newman
requirements.txt
templates
validation
Removing intermediate container cfc9228124fb
 ---> 4cdb9275d6f4
Successfully built 4cdb9275d6f4
Successfully tagged abc:1

在这里,我们使用COPY . /opt 将当前文件夹中的所有内容复制到容器的/opt/。我们使用.dockerignore 忽略不想复制到容器的文件/文件夹。

补充,不确定COPY conftest.py /opt/validation/conftest.py的规则是否正确,如果正确,您可能需要使用RUN mv将其移动到指定文件夹。

【讨论】:

  • 在复制的文件上运行 mv 会增加最终图像的大小,因为受影响的文件将位于不同层的两个位置。 rm 或任何其他将修改文件的命令也是如此。这将按预期工作的唯一方法是当您创建文件并将其移动到单个图层中时,例如wgetmv 在一个 RUN 命令中。
【解决方案2】:

scratch 图像有一点小技巧:

FROM scratch as tmp

COPY foo /opt/some/path/foo
COPY bar /usr/share/tmp/bar

FROM debian:buster

COPY --from=tmp / /

CMD bash -c "ls /opt/some/path /usr/share/tmp"
❯ docker build -t test . && docker run --rm test
/opt/some/path:
foo

/usr/share/tmp:
bar

scratch 是一个伪图像,它很像一个空目录。技巧是将那里的所有内容复制到最终图像中,然后合并根目录。合并生成一个单层。

❯ docker inspect --format '{{.RootFS}}' test
{layers [ 
 sha256:c2ddc1bc2645ab5d982c60434d8bbc6aecee1bd4e8eee0df7fd08c96df2d58bb
 sha256:fd35279adf8471b9a168ec75e3ef830046d0d7944fe11570eef4d09e0edde936
] }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多