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

Docker通过RUN写入SSH_KEY连接Github提示密钥格式错误如何解决

问题原因
  • .env文件无统一的多行字符串解析标准,Docker Compose、docker build等工具读取.env内的多行变量时,会自动将实际换行符转义为\n字面量,写入文件时无法自动还原为真实换行,直接破坏OpenSSH私钥的结构要求。
  • 你提供的.env示例中私钥每一行开头存在多余的反引号字符,属于写入时的冗余格式错误,也会导致密钥校验失败。
  • 直接使用RUN echo "${SSH_KEY}" > /root/.ssh/id_ed25519指令时,默认的echo命令不会解析\n转义字符,会将\n作为普通字符写入文件,无法恢复私钥原本的换行结构。
解决方案

本地Docker构建场景

  • 方案1:转义私钥为单行格式,构建时还原
    首先在本地终端执行以下命令,将私钥转换为带\n转义的单行格式:

    awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' id_ed25519
    

    将命令输出的内容直接粘贴到.env的SSH_KEY赋值位置,不需要额外添加换行或多余引号,示例:

    SSH_KEY=-----BEGIN OPENSSH PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxx\nxxxxxxxxxxxxxxxxxxx\n-----END OPENSSH PRIVATE KEY-----
    

    同时修改Dockerfile中的写入指令,使用printf替代echo还原换行:

    RUN printf "%b" "${SSH_KEY}" > /root/.ssh/id_ed25519 && \
        chmod 600 /root/.ssh/id_ed25519
    

    其中%b参数会自动将\n转义符还原为真实换行,chmod 600是SSH要求的私钥权限配置,否则会触发权限校验失败。

  • 方案2:使用Docker构建机密(推荐,避免密钥泄露)
    Docker 18.09及以上版本支持构建时机密挂载,不需要将密钥存入.env,也不会在镜像层留下密钥痕迹:
    首先修改Dockerfile,声明机密挂载逻辑:

    RUN --mount=type=secret,id=ssh_key \
        cp /run/secrets/ssh_key /root/.ssh/id_ed25519 && \
        chmod 600 /root/.ssh/id_ed25519
    

    构建时传入本地私钥文件即可:

    docker build --secret id=ssh_key,src=./id_ed25519 .
    

Azure Pipelines存储密钥场景

Azure Pipelines的机密变量原生支持多行内容,直接按以下操作即可保留格式:

  • 进入对应Pipeline的变量配置页面,新建机密变量,命名为SSH_KEY
  • 直接将本地完整的私钥文件内容(包含所有原始换行)复制粘贴到变量值输入框,保存为机密
  • 构建步骤中将SSH_KEY变量作为构建参数传入即可,配合上面的printf方案不需要额外转义,Azure Pipelines会自动保留换行结构传递给构建过程。

内容的提问来源于stack exchange,提问作者bstricks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:45:03