我有 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 是一个 bad practice
主要区别在于,在开发中,我使用 golang
图像,这很实用,而在生产中,我使用 scratch
图像,这大大减少了我的二进制文件的大小。
似乎我可以在 Dockerfile 中使用多个阶段,并在构建时指定阶段名称:
docker build . --target=builder
但是如果我这样做,我不知道如何在第一阶段有条件地运行我的应用程序 = [如果我在开发中,则在第一阶段运行应用程序,否则,在第二阶段运行应用程序]
我应该怎么做?
最佳答案
像这样的事情呢?我没有测试它,也没有深入思考你的例子,但也许它接近你的需要/帮助你找到最终的解决方案?
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
中指定的值,将构建不同的镜像。
关于docker - 如何为开发和生产使用相同的 dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112537/