使用循环将文件添加到 docker 镜像

时间:2021-03-25 07:05:42

标签: docker dockerfile docker-image

我有一个脚本可以创建多个以 part_ 开头的文件,我想在 Dockerfile 中创建一个 for 循环来搜索以 part_ 开头的文件的目录并将它们添加到 docker 镜像。将每个文件添加为单独的层很重要(而不是使用 ADD part_* /directory/ 之类的通配符)。如何将文件动态添加到 docker 镜像?

我想使用类似 RUN for f in part_*; do ADD $f /data/; done 的东西,但我不知道如何将 ADD 合并到 bash 脚本中。

这是 Dockerfile 的示例。

FROM ubuntu:20.04

RUN apt-get update && \
    rm -rf /var/lib/apt/lists/*

ADD part_aa /directory/
ADD part_ab /directory/
ADD part_ac /directory/
ADD part_ad /directory/
ADD part_ae /directory/
ADD part_af /directory/

COPY entrypoint.sh /usr/local/bin/

CMD entrypoint.sh

2 个答案:

答案 0 :(得分:2)

您可以使用脚本来创建您的 Dockerfile;

echo "FROM ubuntu:20.04" > Dockerfile
echo "RUN apt-get update && \
    rm -rf /var/lib/apt/lists/*" >> Dockerfile

for f in part_*; do echo "ADD $f /data/" >> Dockerfile; done

echo "COPY entrypoint.sh /usr/local/bin/" >> Dockerfile
echo "CMD entrypoint.sh" >> Dockerfile

答案 1 :(得分:0)

Dockerfile COPY 指令(和 ADD,但您通常应该更喜欢 COPY)理解普通的 shell glob,因此您可以

COPY part_* .

(如果这些文件来自 split(1) 命令,而您只是将它们cat(1) 放在一起,它可能会更容易并且在您 docker build 图像之前,在主机上将它们组合起来要小得多;RUN rm 实际上从未使图像更小,因此您的图像大小将包括部件的大小和组合文件的大小。)

相关问题