我有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
但是,如果我这样做,我不知道如何在第一阶段有条件地运行我的应用程序= [如果我在开发中,请在第一阶段运行该应用程序,否则,请在第二阶段运行该应用程序]
我应该怎么做?
答案 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=prod
或docker build --target=dev
中指定的值,将生成其他图像。