docker - 如何为 dev 和 prod 使用相同的 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 是一种不好的做法
主要区别在于,在开发中,我处理的golang
是实用的图像,而在产品中,我使用的是scratch
图像,这大大减少了我的二进制文件的大小。
似乎我可以在 Dockerfile 中使用多个阶段,并在构建时指定阶段名称:
docker build . --target=builder
但是如果我这样做,我不知道如何在第一阶段有条件地运行我的应用程序 = [如果我在 dev 中,则在第一阶段运行应用程序,否则,在第二阶段运行应用程序]
我应该怎么做?
解决方案
这样的事情呢?我没有对其进行测试,也没有深入思考您的示例,但可能接近您需要的/帮助您找到最终解决方案?
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"]
根据 targetdocker build --target=prod
或docker build --target=dev
中指定的值,将构建不同的图像。
推荐阅读
- pine-script - 如何将其转换为常量以将其提供给 pinescript 中的最高函数
- python - 如何设置访问令牌oauth2的到期时间
- elasticsearch - 如何在弹性搜索中过滤大量嵌套文档?
- javascript - UI - 反应如何在同一行中添加图像
- jquery - 使用 jquery 将 html 对象的可见性传递给 ASP 经典
- python - 无法在烧瓶 restapi 中输出 status_code
- android - 如何检测应用程序何时被android中的用户关闭?
- javascript - 解构数组
- spring - 在子表内部如何在更新记录时更改外键?
- c# - C# .NET5 单文件应用程序从目录中读取和解析 Json / Txt 或其他文件格式