小编典典

如何为开发和生产使用相同的dockerfile

go

我有2个Dockerfile,1个用于dev,1个用于prod:

产品:

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"]

和DEV:

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

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

我该怎么办?


阅读 222

收藏
2020-07-02

共1个答案

小编典典

那这样的东西呢?我没有对其进行测试,也没有对您的示例进行深入的思考,但是也许与您需要的东西很接近/可以帮助您找到最终的解决方案?

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"]

根据target docker build --target=prod或中指定的值docker build --target=dev,将生成其他图像。

2020-07-02