如何在GitHub Action的Dockerfile中向Go二进制程序传递参数?
问题:如何将GitHub Action输入参数传递给Docker ENTRYPOINT的Go二进制程序?
我知道在GitHub Action的bash脚本里怎么用输入参数,但当Dockerfile的ENTRYPOINT是Go编译的二进制程序时,不知道怎么把GitHub Action的输入参数传给这个程序。
我的action.yml:
--- name: Semantic Version Github Action description: Github Action to streamline Release Workflows with Semantic Version Validation for Accurate and Consistent Versioning inputs: command: description: The semver command that should be run default: "" required: true runs: using: 'docker' image: 'src/main/Dockerfile' args: - ${{ inputs.command }}
我的Dockerfile:
FROM golang:1.20-rc-alpine AS build LABEL maintainer="sebastian@sommerfeld.io" COPY app /app WORKDIR /app RUN go mod download \ && go test ./... \ && go build . FROM alpine:3.18.2 AS run LABEL maintainer="sebastian@sommerfeld.io" COPY --from=build app/semver /usr/bin/semver ARG USER=semver RUN adduser -D $USER USER $USER # ENTRYPOINT [ "/usr/bin/semver $INPUT_COMMAND" ] # -> 不生效 ENTRYPOINT [ "/usr/bin/semver" ] # -> 只会打印程序帮助,不执行实际命令
我的workflow.yml相关部分:
# [...] jobs: semver: runs-on: ubuntu-latest steps: # [...] - name: Validate version uses: sommerfeld-io/semver-action@main with: command: validate ${{ github.event.inputs.version }} # [...]
解决方案
问题根源在于:你当前把整个command作为单个参数传递给Docker,而Go程序期望的是拆分后的多个参数(比如validate和版本号是两个独立参数)。同时Docker的ENTRYPOINT使用exec格式(数组写法)时,不会自动解析字符串里的空格。
方案1:拆分命令字符串为多个参数
修改action.yml,使用split函数把输入的command按空格拆分成独立参数,这样Docker会将每个参数单独传递给Go程序:
--- name: Semantic Version Github Action description: Github Action to streamline Release Workflows with Semantic Version Validation for Accurate and Consistent Versioning inputs: command: description: The semver command that should be run default: "" required: true runs: using: 'docker' image: 'src/main/Dockerfile' args: ${{ split(inputs.command, ' ') }}
Dockerfile保持不变,继续使用exec格式的ENTRYPOINT:
# ... 其他部分不变 ... USER $USER ENTRYPOINT [ "/usr/bin/semver" ]
这样GitHub Action会把validate 1.0.0拆成["validate", "1.0.0"]两个参数传给Docker,Go程序就能正确接收并执行对应逻辑。
方案2:拆分输入参数(更稳健)
如果你的命令结构固定(比如子命令+版本号),建议直接把输入拆分成两个独立参数,避免字符串拆分可能带来的问题:
修改action.yml,新增version输入项:
--- name: Semantic Version Github Action description: Github Action to streamline Release Workflows with Semantic Version Validation for Accurate and Consistent Versioning inputs: command: description: The semver subcommand (e.g. validate) default: "" required: true version: description: The version string to operate on default: "" required: true runs: using: 'docker' image: 'src/main/Dockerfile' args: - ${{ inputs.command }} - ${{ inputs.version }}
对应的workflow.yml也要调整:
# [...] jobs: semver: runs-on: ubuntu-latest steps: # [...] - name: Validate version uses: sommerfeld-io/semver-action@main with: command: validate version: ${{ github.event.inputs.version }} # [...]
Dockerfile依然保持原有的exec格式ENTRYPOINT即可。
为什么之前的写法不行?
- 你注释掉的
ENTRYPOINT [ "/usr/bin/semver $INPUT_COMMAND" ]是错误的:exec格式不会解析环境变量和空格,Docker会把整个字符串当作一个可执行文件的路径,自然找不到。 - 原来的
args传递单个字符串参数时,Go程序只会收到一个完整的validate 1.0.0字符串,而不是两个独立的命令参数,所以程序只会触发默认的帮助输出。
内容的提问来源于stack exchange,提问作者Sebastian Sommerfeld
相关产品推荐
相关产品推荐

