gpt4 book ai didi

java - 如何创建可重用的 dockerfile 模板?

转载 作者:行者123 更新时间:2023-12-05 04:32:42 25 4
gpt4 key购买 nike

我发现自己经常重复 dockerfile内容。例如对于一个典型的 spring-boot应用程序,这将如下所示:

FROM $BUILD_IMAGE as build
COPY pom.xml .
RUN mvn dependency:go-offline

COPY src src
RUN mvn package
RUN java -Djarmode=layertools -jar target/application.jar extract

FROM $RUNTIME_IMAGE
COPY --from=build /application/dependencies/ ./
COPY --from=build /application/spring-boot-loader/ ./
COPY --from=build /application/snapshot-dependencies/ ./
COPY --from=build /application/application/ ./

EXPOSE 8081
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

根据执行 dockerfile 的项目,这里只有 3 个是动态的:pom.xml , src , EXPOSE <port> .其他一切始终如一。

问题:是否可以创建某种"template",以便我可以将这 3 个动态文件或文件夹“提供”给模板?

我不想复制 dockerfile以 1:1 的比例进入我的所有项目。如果我可以使用 dockerfile 作为基本定义,并从我所有的 spring-boot 项目中引用它,我会更愿意。

最佳答案

我们可以通过 ARG directive (docs.docker.com) 实现这一点.这是一个示例 Dockerfile:

# syntax=docker/dockerfile:1
ARG TAG

FROM ubuntu:$TAG
ARG FILE_TO_COPY
ARG EXPOSE_PORT
COPY $FILE_TO_COPY file.txt
CMD cat file.txt

EXPOSE $PORT_TO_EXPOSE

第一个 FROM 之前的任何 ARG 和第一个 FROM 之后的任何 arg 之间存在语义差异:前者可以在FROM 指令,例如定义标签或摘要。它的值在构建阶段不可用。后者属于构建阶段,因此只能在构建阶段访问。此行为指定为 here (docs.docker.com) .

我们可以构建图像,指定构建参数:

$ docker build \
--build-arg TAG=18.04 \
--build-arg FILE_TO_COPY=foo.txt \
--build-arg PORT_TO_EXPOSE=8080 \
--tag test \
.

然后运行它:

$ docker run -it --rm test
bar

关于java - 如何创建可重用的 dockerfile 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71605250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com