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

标签 docker go 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 是一个 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=proddocker build --target=dev 中指定的值,将构建不同的镜像。

关于docker - 如何为开发和生产使用相同的 dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112537/

相关文章:

将字符串作为 %09d 的参数时,sprintf 的 golang 错误

azure - 使用私有(private)注册表中的镜像进行 k8s 部署

Docker 无法在 docker-compose 中使用参数(使用 .env 中的参数)

docker - 在容器中运行的应用无法连接到VM本地主机上的沙发

mysql - GoLang 的配置返回 "non-name"错误

docker - 如何将 rpm 安装到/usr/bin 而不是/opt/app-root/bin

Docker 教程都绑定(bind)到 80 端口,并且在本地和远程服务器上失败,因为端口 80 已经在使用中

go - 在 := 的左侧添加结构变量/名称

docker - 在 Docker 构建期间传递配置文件的最佳方式

git - 我们可以更新 Docker Image 中的 git 版本吗?