构建百宝箱镜像:在容器内使用 rsync 和远程上Linux上同步文件
之前一直都是使用scp
远程拷贝文件,最大的麻烦在于它每次都是全量拷贝。没有使用rsync
的原因是,这货在windows
没有什么免费开源又原生的安装包——基于Cygwin的不算。
考虑到如今Docker
镜像已经是大家的标配了,我们可以直接在本地构建一个工具箱镜像,然后在工具箱容器内跑rsync
。
FROM debian:latest
RUN apt-get update
RUN apt-get upgrade
RUN apt-get install -y openssh-client
RUN apt-get install -y wget curl git
RUN apt-get install -y rsync
ENTRYPOINT [ "/bin/bash" ]
构建工具箱镜像,这个镜像是未来我们手头随时可用的百宝箱:
docker build -t newbiebox:0.1.0 .
在powershell
中挂载本地.ssh
目录,运行一个用完即删的容器:
docker run --rm --name newbiebox -it `
-v C:/Users/stdunit/.ssh:/root/.ssh `
-v C:\Users\stdunit\Desktop:/Desktop `
newbiebox:0.1.0
这里挂载本地.ssh
目录是因为rsync
远程拷贝是基于ssh
的,为了在容器内免密码登录远程服务器,需要把本地宿主上的.ssh
私钥和密钥拷贝暴露给我们的容器。
如果是第一次挂载
.ssh
,可能需要修复一下这个目录下的读写权限——在windows下我们通常意识不到这个问题,但是Linux对权限检查比较严格。在容器内运行如下命令:chmod 700 /root/.ssh # 只有用户有访问权限 chmod 600 /root/.ssh/id_rsa # 只有用户有读写权限 chmod 644 /root/.ssh/id_rsa.pub # 让其他人可以读取 chmod 644 /root/.ssh/config # 便客户端能读取配置文件
然后在容器内,使用rsync
进行远程拷贝:
rsync -avz /Desktop/test-rsync/ username@remote-server:/dst/test-r
如果远程ssh
的端口被改了,可以使用 -e "ssh -p 端口号"
的形式:
rsync -e "ssh -p PORT" -avz /Desktop/test-rsync/ username@remote-server:/dst/test-r
上面的这两条指令是把本地文件同步到远程服务器,通过对调源路径和目标路径,可以实现把远程服务器的文件同步到本地:
rsync -e "ssh -p PORT" -avz user@remote-server:/path-to-backup /Desktop/backup/