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

时间:2019-05-13 12:37:57

标签: docker go dockerfile

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

和开发:

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

我想将这两个合并为一个,因为维护2个Dockerfile是bad practice

主要区别在于,在开发人员中,我使用golang图像,这很实用;而在产品中,我使用scratch图像,这减小了我的二进制文件的大小。 / p>

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

docker build . --target=builder

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

我应该怎么做?

1 个答案:

答案 0 :(得分:3)

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

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

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