小编典典

Dockerfile中的条件复制/添加?

all

在我的 Dockerfiles 中,如果存在,我想将一个文件复制到我的图像中,pip 的 requirements.txt
文件似乎是一个不错的候选者,但是如何实现呢?

COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

或者

if test -e requirements.txt; then
    COPY requiements.txt /destination;
fi
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

阅读 93

收藏
2022-08-17

共1个答案

小编典典

目前不支持此功能(因为我怀疑它会导致无法复制的图像,因为相同的 Dockerfile 会复制或不复制该文件,具体取决于它的存在)。

issue 13045中仍然要求使用通配符:“
COPY foo/* bar/" not work if no file in foo”(2015 年 5 月)。
它现在(2015 年 7 月)不会在 Docker 中实现,但是像 bocker
这样的另一个构建工具可以支持这一点。


2021 年

COPY source/. /source/对我有用(即在是否为空时复制目录,如“无论是否为空,都将目录复制到 docker build -
失败” COPY failed: no source files were specified
”)

2022

这是我的建议:

# syntax=docker/dockerfile:1.2

RUN --mount=type=bind,source=jars,target=/build/jars \
 find /build/jars -type f -name '*.jar' -maxdepth 1  -print0 \
 | xargs -0 --no-run-if-empty --replace=source cp --force source

”${INSTALL_PATH}/modules/”

这可以解决:

COPY jars/*.jar "${INSTALL_PATH}/modules/"

但是如果没有找到,则复制 no *.jar,而不会引发错误。

2022-08-17