Docker构建时COPY指令未将docker-upload私钥复制到容器问题排查
解决Docker容器构建后~/.ssh目录为空的问题
嘿,我来帮你搞定这个问题!你遇到的~/.ssh目录为空的情况,核心原因是Docker指令里的~解析逻辑和你想的不一样。
问题根源
在Dockerfile的RUN指令里,~会被shell解析为当前用户(这里是root)的家目录/root,但COPY指令是Docker直接处理的,它不会把~当作shell的家目录别名,而是会把~/.ssh/当成字面路径——也就是尝试把文件复制到当前工作目录下的.ssh子目录,而不是你预期的/root/.ssh!这就导致文件根本没复制到正确的位置,所以最后ls看到的/root/.ssh还是空的。
修复方案
把所有用到~的路径都换成绝对路径/root/.ssh,同时记得给私钥设置SSH要求的严格权限(必须是600,否则后续SSH连接会报错)。修改后的Dockerfile如下:
FROM centos:7 RUN yum -y -q install openssh-clients && \ yum clean all && \ rm -rf /var/cache/yum RUN \ mkdir -p /root/.ssh && \ touch /root/.ssh/known_hosts && \ ssh-keyscan -p 2022 -t rsa hostname > /root/.ssh/known_hosts COPY docker-upload /root/.ssh/ # 给私钥设置正确权限,避免SSH拒绝使用 RUN chmod 600 /root/.ssh/docker-upload && \ ls -all /root/.ssh
额外验证点
如果修改后还是有问题,先确认:
docker-upload文件是不是和你的Dockerfile在同一个目录下(构建上下文里必须存在这个文件,否则COPY会失败)- 构建命令的上下文路径是否正确(你用的是
.,也就是当前目录,这个没问题)
重新执行构建命令,你就能在ls的输出里看到docker-upload文件了。
内容的提问来源于stack exchange,提问作者mles
相关产品推荐
相关产品推荐

