You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:27:04