【问题标题】:Inject or interpolate more than one ENV variable in go build command within dockerfile在 dockerfile 的 go build 命令中注入或插入多个 ENV 变量
【发布时间】:2019-06-18 04:27:12
【问题描述】:

我正在使用 dockerfile 来构建 go 代码,并且尝试在 -ldflags 选项中传递 3 个选项。 其中两个标志来自 ENV 变量,我必须通过字符串插值或串联将它们注入到 -ldflags 内容中,但我不知道如何。

目标是在 main.go 的两个变量中注入 git 修订哈希和当前时间戳

这可以通过creating a file from dockerfile 使用“echo”命令来完成,但我想确保使用简单的变量插值/连接是不可能的

ENV GIT_REVISION $( git rev-parse --short HEAD )

ENV COMPILATION_TIMESTAMP $( date +%Y%m%dT%H:%M:%S )

RUN go get -d -v

// This one works:
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o myprogram .

// This one, with those variables, fails:
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags "-extldflags '-static' -X main.compiledOn=${COMPILATION_TIMESTAMP} -X main.gitRevisionHash=${GIT_REVISION}" -o myprogram .

【问题讨论】:

标签: git go dockerfile


【解决方案1】:

不幸的是,当前的 Docker 构建器命令都不支持环境变量替换。您最好的选择是编写一个 shell 脚本,其中环境变量替换是一等公民。然后,当您调用 RUN ./script 时,您将能够从前面的层中捕获 ENV 值。

【讨论】:

    【解决方案2】:

    我无法标记为解决方案,但想分享我是如何使用替代方法解决潜在问题的:

    # Handle source-code-file extvars.go to inject GIT_REVISION and COMPILATION_TIMESTAMP
    # File extvars.go exists and compiles normally already, and I'm just providing a new/updated one:
    RUN echo "package main" > $APPDIR/extvars.go
    RUN echo "" >> $APPDIR/extvars.go && \
        echo "var gitRevision = \"$( git rev-parse --short HEAD )\"" >> $APPDIR/extvars.go && \
        echo "" >> $APPDIR/extvars.go && \
        echo "var compilationTimestamp = \"$( date +%Y.%m.%dT%H:%M:%S)\"" >> $APPDIR/extvars.go
    
    
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多