需求:在工作中,有时使用的软件是用docker服务部署的为了数据的安全又没有使用volume 命令挂载目录而且docker容器中也没有解压命令,然而docker cp 命令每次只能复制一个文件,这样脚本测试起来就非常的麻烦。实现批量复制脚本是非常必要的。
1、首先需要了解docker 的复制命令,有两种 一种是从容器复制到宿主机,另一种是从宿主机里复制到容器。
1、容器->宿主机 docker cp container:/tmp/xxxx.log /tmp
2、宿主机->容器:docker cp /tmp/xxxx.log container:/tmp
2、找到需要复制的容器ID,可以使用 docker ps | grep 'xxxxx' | awk '{print $1}',找到这个值。例如:471aecda9acf, awk '{print $1}' 是打印第一列的值
3、使用 docker复制命令:docker cp 471aecda9acf:/tmp/xxxx.log /tmp 就可以将docker中/tmp 目录下存在的xxxx.log 文件复制到宿主机的 /tmp目录。
脚本思路:
1、判断是否启动docker 服务 systemctl status docker | grep running
2、查看当前文件的路径 `pwd `
3、找到要复制的容器的ID docker ps | grep 'xl-job-executor' | awk '{print $1}
4、判断容器是否存在 if [ -n "$container" ]; then
5、判断宿主机脚本是否存在 if test -e ${path_dir}/$1; then
6、复制文件到docker容器 docker cp ${path_dir}/$1 $container:/usr/software/check
7、复制成功打印结果 echo "copy $1 is OK, $container"
#!/bin/bash
:<<EOF
1、查看docker状态
2、复制当前文件到docker容器
EOF
status=$(systemctl status docker | grep running)
if [[ $? == 0 ]]; then
path_dir=$(pwd)
container=$(docker ps | grep 'xl-job-executor' | awk '{print $1}')
if [ -n "$container" ]; then
if test -e ${path_dir}/$1; then
docker cp ${path_dir}/$1 $container:/usr/software/check
if [[ $? == 0 ]]; then
echo "+++--------------------------------------+++"
echo "copy $1 is OK, $container"
else
echo "copy Failed "
fi
else
echo "$1 file not found"
fi
else
echo "xl-job-executor* not found container"
fi
else
echo 'docker is not running, please start docker'
fi
注:$? 可使用$? 获取上次执行命令的结果,0执行成功,且有返回值,其它执行失败
test -e /file 判断文件是否存
-n "$container" 可以判断字符串是否为空
4、上述代码只是复制脚本的一个快捷方式,但是也只能复制一个脚本。还需要使用以下代码,可实行批量复制.docker_cp.sh一定要加入到环境变量才可以这样执行。添加环境变量的方法
for file in `ls deploy_check_pg_*`;do docker_cp.sh $file; done;