我想做这个:
COPY src/ public/ config-overrides.js /usr/src/app/
但我通过惨痛的经历才明白,这实际上意味着:
COPY src/* public/* config-overrides.js /usr/src/app/
这根本不是我想要的。
我可以通过 来破解这个问题.dockerignore
,但我不喜欢这个解决方案,因为:
- 如果有新文件添加到 repo,
.dockerignore
则也需要将其添加到。 - 我喜欢在我的
Dockerfile
如何在单个层中复制文件和目录的明确列表(而不仅仅是内容)?
我只是 SOL 吗?
答案1
您可以重新组织仓库:
app
+-- src
+-- public
\-- config-overrides.js
然后你就
COPY app/ /usr/src/app/
另一种选择是采用多阶段构建:
FROM scratch as app
COPY src/ /usr/src/app/
COPY public/ /usr/src/app/
COPY config-overrides.js /usr/src/app/
FROM your_base
COPY --from=app /usr/src/app/ /usr/src/app/
否则,请将其保留为 3 个单独的层。增加一个层所带来的额外开销实际上微乎其微。您需要合并层的情况是当您有数十个层时,如果您在多个层中有相同的文件并且会覆盖它,或者您更改/删除了在前一个层中创建的文件。