Docker构建时密钥文件出现乱码��问题排查求助
Docker Build Secret 生成文件开头乱码问题排查与解决
问题重现
本地有文件ssh_key.txt,内容为my_private_key,Dockerfile中使用以下指令挂载并写入密钥:
RUN --mount=type=secret,id=ssh_key \ cat /run/secrets/ssh_key > /home/${USER_NAME}/.ssh/git_key
执行构建命令:
docker build --secret id=ssh_key,src=ssh_key.txt -t my_image .
运行镜像后查看/home/${USER_NAME}/.ssh/git_key,内容变为��my_private_key,开头出现乱码。
原因分析
乱码��对应字节0xFF 0xFE,是UTF-16LE编码的字节顺序标记(BOM)。大概率是你的ssh_key.txt文件本身以UTF-16LE编码保存(带BOM),或者Docker在传递secret时意外引入了BOM字节。当你用cat直接重定向时,BOM会被保留在目标文件中,导致显示乱码。
解决方案
方案1:修复源文件编码
将ssh_key.txt转换为UTF-8无BOM编码:
# 查看文件编码 file ssh_key.txt # 转换为UTF-8无BOM iconv -f UTF-16LE -t UTF-8 ssh_key.txt > ssh_key_utf8.txt # 用转换后的文件构建 docker build --secret id=ssh_key,src=ssh_key_utf8.txt -t my_image .
方案2:在Dockerfile中去除BOM
如果无法修改源文件,可在写入时直接剔除开头的BOM字节:
RUN --mount=type=secret,id=ssh_key \ tail -c +3 /run/secrets/ssh_key > /home/${USER_NAME}/.ssh/git_key
或者用tr命令删除指定字节:
RUN --mount=type=secret,id=ssh_key \ tr -d '\xFF\xFE' < /run/secrets/ssh_key > /home/${USER_NAME}/.ssh/git_key
方案3:验证secret内容
构建前先检查源文件的字节内容,确认是否存在BOM:
hexdump -C ssh_key.txt # 正常UTF-8无BOM的内容开头应该是:6d 79 5f 70 72 69 76 61 74 65 5f 6b 65 79 # 如果开头是ff fe 6d 79 ...,则说明是UTF-16LE带BOM
内容的提问来源于stack exchange,提问作者KTOV
相关产品推荐
相关产品推荐

