Dockerfile中SSH密钥格式无效导致Git子模块拉取失败如何修复
问题原因
- 原代码中处理SSH私钥的Python脚本使用了Python2专属的
raw_input()语法,而当前openjdk:11基础镜像中apt install python默认安装的是Python3,执行报错导致生成的/root/.ssh/id_rsa内容格式完全错误,这是触发invalid format报错的核心原因 - 直接使用
echo $SSH_KEY传递参数会丢失密钥中的特殊格式字符,也会导致私钥格式异常 - 原Dockerfile未显式安装git、openssh-client依赖,部分版本的openjdk基础镜像没有预装这两个工具,会导致git操作失败
修正后的Dockerfile
FROM openjdk:11 COPY . . # 统一安装所有需要的依赖,包含python3、git、ssh客户端 RUN apt-get update -y && \ apt-get install -y python3 git openssh-client && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /root/.ssh && \ chmod 0700 /root/.ssh && \ ssh-keyscan gitlab.com > /root/.ssh/known_hosts ARG SSH_KEY=autofilled # 改用Python3语法,用printf传递参数避免丢失格式 RUN printf "%s" "$SSH_KEY" | python3 -c "key = input();print('-----BEGIN OPENSSH PRIVATE KEY-----\n' + '\n'.join(key[i:i+64] for i in range(0, len(key), 64)) + '\n-----END OPENSSH PRIVATE KEY-----')" > /root/.ssh/id_rsa RUN chmod 600 /root/.ssh/id_rsa RUN git submodule init RUN git submodule update # 构建完成后删除私钥,避免敏感信息留存到镜像中 RUN rm -rf /root/.ssh/ RUN chmod -R +x ./sbt-dist RUN chmod +x ./sbt RUN ./sbt dist WORKDIR ./target/universal RUN unzip ./dist.zip WORKDIR ./dist/bin RUN chmod +x ./smart-flats EXPOSE 5000 CMD ["./smart-flats", "-Dhttp.port=5000", "-J-Xmx1536m"]
构建注意事项
传入SSH_KEY参数时,需要先把本地私钥文件的所有换行符删除,转换为单行字符串后再作为构建参数传入,示例构建命令如下:
docker build --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa | tr -d '\n')" .
内容的提问来源于stack exchange,提问作者Sizor
相关产品推荐
相关产品推荐

