首页 > 解决方案 > 如何为 dev 和 prod 使用相同的 dockerfile

问题描述

我有 2 个 Dockerfile,1 个用于开发,1 个用于生产:

产品:

FROM golang AS builder
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM scratch
EXPOSE 9999
COPY --from=builder /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

和开发:

FROM golang
WORKDIR /go/src/gitlab.com/company/PROJECT
COPY . .
RUN go build -o ./release/api .
CMD ["./release/api"]

我想将这两个合并为一个,因为维护 2 Dockerfile 是一种不好的做法

主要区别在于,在开发中,我处理的golang是实用的图像,而在产品中,我使用的是scratch图像,这大大减少了我的二进制文件的大小。

似乎我可以在 Dockerfile 中使用多个阶段,并在构建时指定阶段名称:

docker build . --target=builder

但是如果我这样做,我不知道如何在第一阶段有条件地运行我的应用程序 = [如果我在 dev 中,则在第一阶段运行应用程序,否则,在第二阶段运行应用程序]

我应该怎么做?

标签: dockergodockerfile

解决方案


这样的事情呢?我没有对其进行测试,也没有深入思考您的示例,但可能接近您需要的/帮助您找到最终解决方案?

FROM golang:alpine AS base
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM base AS dev
CMD ["./release/api"]

FROM scratch AS prod
EXPOSE 9999
COPY --from=base /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

根据 targetdocker build --target=proddocker build --target=dev中指定的值,将构建不同的图像。


推荐阅读