对多个 dockerfile 使用共享 dockerfile

moh*_*mad 3 python go docker kubernetes dockerfile

我拥有的是多个相似且简单dockerfile

但我想要的是有一个单一的基础dockerfile,我的dockerfiles 将它们的变量传递给它。

在我的情况下, s 之间的唯一区别dockerfile只是它们EXPOSE,所以我认为最好保留一个基础dockerfile,而其他dockerfiles 仅将变量注入到基础中,dockerfile就像模板引擎一样

一个样品dockerfile

FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o /bin/app ./cmd/root.go

FROM alpine:latest
WORKDIR /bin/
COPY --from=builder /bin/app .
EXPOSE 8080
LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-auth"
ENTRYPOINT ["/bin/app"]
CMD ["server", "--env=dev"]
Run Code Online (Sandbox Code Playgroud)

Yas*_*sen 5

IMPORT指令永远不会被执行

\n

很久以前就有提议的IMPORT指令Docker

\n

不幸的是,问题已经关闭,而 PR 仍然开放:

\n\n

针对您案例的解决方案

\n

但对于你的情况,你所需要的只是一点点sed

\n

例如:

\n
# Case1: inplace templating\nEXPOSED_PORT=8081 sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile\n\n# Case2: generating Dockerfile from template\nsed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile\n
Run Code Online (Sandbox Code Playgroud)\n

解释:

\n
    \n
  • EXPOSED_PORT=8081声明局部bash变量
  • \n
  • sed是一个文本操作工具
  • \n
  • sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile替换EXPOSE 8080EXPOSE 8081
  • \n
  • sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile生成新DockerfileDockerfile.template
  • \n
\n