【问题标题】:Provide dependent file in a multi-stage build在多阶段构建中提供依赖文件
【发布时间】:2022-02-15 18:55:31
【问题描述】:

我需要从文件“cert.pem”中读取我的应用程序,该文件的路径是 a) 作为参数提供或 b) 从主应用程序文件 main.py 的目录中检索。

我创建了以下 dockerfile,但在使用映像构建和运行我的应用程序后,无法访问“cert.pem”文件。有没有办法从这个文件中读取?

FROM golang:1.17-alpine AS builder
RUN apk add --no-cache git
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o ./bin .


#final stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/bin /app/bin
EXPOSE 3000

CMD ["/app/bin"]

加载文件的指令如下:

....
var (
    cert_file = flag.String("cert", "./cert.pem", "File name of x509 certificate")
)
...
func main() {
...
    _, err := ioutil.ReadFile(*cert_file)
...

【问题讨论】:

    标签: dockerfile dependencies docker-multi-stage-build


    【解决方案1】:

    您只需将您的 cert.pem 文件复制到 docker 中最后阶段的二进制文件的位置。假设您的 docker 构建上下文中有证书文件,您可以运行复制命令。

    FROM golang:1.17-alpine AS builder
    RUN apk add --no-cache git
    WORKDIR /app
    COPY . .
    RUN go mod download
    RUN go build -o ./bin .
    
    
    #final stage
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/bin /app/bin
    COPY cert.pem /app/
    EXPOSE 3000
    
    CMD ["/app/bin"]
    

    确保您将 go 程序中的 cert.pem 位置设置为 ./cert.pem

    【讨论】:

    • 正如我所说,确保您的 cert.pem 文件在您的 docker 构建上下文中,或者在 COPY 层中添加完整路径。如果您想进一步调试,请在最后一步之后添加一个 RUN ls 层,并确保该文件在那里。或者构建容器看看有没有错误@leviathan
    • 当我检查图像中的内容时,cert.pem 文件位于图像的 /app 文件夹中。构建时我也没有收到任何错误...
    • 所以你必须这样做 COPY --from=builder /app/cert.pem /app/cert.pem
    • 这不行,如果添加 COPY --from=builder /app/cert.pem /app/cert.pem: /app # ls bin cert.pem 文件已经存在
    【解决方案2】:

    解决方法是定义一个ENTRYPOINT而不是CMD并添加一个WORKDIR指令:

    #build stage
    FROM golang:1.17-alpine AS builder
    RUN apk add --no-cache git
    WORKDIR /app
    COPY . .
    RUN go mod download
    RUN go build -o ./bin .
    
    #final stage
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/bin /app/bin
    COPY --from=builder /app/cert.pem /app/cert.pem
    
    EXPOSE 3000
    
    WORKDIR /app
    ENTRYPOINT ["/app/bin"]
    

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 2020-04-07
      • 2020-03-19
      • 2011-02-27
      • 2018-06-06
      • 1970-01-01
      • 2013-11-07
      • 2020-12-15
      • 2021-08-23
      相关资源
      最近更新 更多