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

如何在单个Dockerfile中为私有Go模块兼容SSH与PAT认证

合并Go私有模块认证的Dockerfile(本地SSH + CI PAT)

需求背景

需要将两个分别适配本地开发(SSH认证)和Github Actions(PAT认证)的Dockerfile合并为一个,实现同一镜像构建文件支持两种私有Go模块认证方式。

合并后的Dockerfile

FROM docker.io/golang:1.23 AS builder
WORKDIR /go/src/

# 安装通用依赖:SSH客户端与Git(CI环境安装无负面影响)
RUN apt update && apt install -y openssh-client git && rm -rf /var/lib/apt/lists/*
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

COPY go.mod go.sum ./

# 配置私有模块的环境变量
RUN go env -w GOPRIVATE=github.com/my-organization
RUN go env -w GONOPROXY=github.com/my-organization

# 声明CI专用的PAT参数,默认空值
ARG CICD_PERSONAL_ACCESS=""

# 根据是否传入PAT自动切换认证配置
RUN if [ -n "${CICD_PERSONAL_ACCESS}" ]; then \
        # CI环境:用PAT替换GitHub HTTPS地址
        git config --global url."https://x-access-token:${CICD_PERSONAL_ACCESS}@github.com".insteadOf https://github.com; \
    else \
        # 本地开发:用SSH替换GitHub HTTPS地址
        git config --global url.git@github.com:.insteadOf https://github.com; \
    fi

# 匹配认证方式执行模块下载
RUN if [ -n "${CICD_PERSONAL_ACCESS}" ]; then \
        go mod download && go mod verify; \
    else \
        --mount=type=ssh go mod download && go mod verify; \
    fi

构建命令

  • 本地开发环境:
    docker build . --ssh default
    
  • Github Actions CI环境:
    docker build . --build-arg CICD_PERSONAL_ACCESS=${{ secrets.CICD_PERSONAL_ACCESS }}
    

方案说明

  1. 通用基础配置:统一安装SSH客户端与Git,配置GitHub的SSH known_hosts,设置私有模块的GOPRIVATE/GONOPROXY环境变量,确保两种环境都能识别私有模块。
  2. 条件分支逻辑:通过ARG CICD_PERSONAL_ACCESS的存在与否判断当前构建环境:
    • 本地构建时不传该参数,自动启用SSH认证配置与挂载;
    • CI构建时传入PAT,自动切换为HTTPS+PAT的认证方式。
  3. 无冗余操作:CI环境下安装SSH客户端不会影响构建流程,仅增加少量镜像体积,换来配置的统一性,无需维护两个Dockerfile。

内容的提问来源于stack exchange,提问作者pdebakker-auguria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:43:16