我目前正在研究用于构建docker映像并重新启动在远程主机上运行的容器的shell脚本。下面是该代码的精简版本。
#!/bin/bash -xe
# usages: ./deploy.sh [PROJECT_REPO] [DOCKER_IMAGE] [TARGET_HOST] [KEYPAIR_PATH]
PROJECT_REPO=$1
DOCKER_IMAGE=$2
TARGET_HOST=$3
KEYPAIR_PATH=$4
PROJECT_DIR=$(echo $PROJECT_REPO | cut -d'/' -f 2 | cut -d '.' -f 1)
CONTAINER=$PROJECT_DIR
USER="ubuntu"
git clone $PROJECT_REPO
cd $PROJECT_DIR
if docker build -t $DOCKER_IMAGE .; then
docker push $DOCKER_IMAGE
if ssh -o StrictHostKeyChecking=no -i $KEYPAIR_PATH $USER@$TARGET_HOST -yes DOCKER_IMAGE=$DOCKER_IMAGE CONTAINER=$CONTAINER '\
docker pull $DOCKER_IMAGE && \
docker stop $CONTAINER
docker rm $CONTAINER
docker run -d --name=$CONTAINER $DOCKER_IMAGE'; then
echo "success"
else
echo "Failure"
exit 1
fi
else
echo "Error during building image"
exit 1
fi
我正在尝试使该脚本通用化,以便通过运行包含项目详细信息(存储库URL,docker映像)的脚本将其用于不同的项目,但是当我尝试运行脚本时,docker出现了错误命令,原因是环境变量的值,DOCKER_IMAGE
并且CONTAINER
在远程主机上为空。
对于这个简单的脚本,使用双引号而不是单引号将填充父外壳程序中的变量。
当然,如果你的脚本包含字符串或应其他表达式不是由你开始这个脚本主机上的母贝进行插值,那些需要进行转义或以其他方式中和。但是您似乎没有任何一个。
if ssh -o StrictHostKeyChecking=no -i $KEYPAIR_PATH $USER@$TARGET_HOST -yes "\
docker pull $DOCKER_IMAGE && \
docker stop $CONTAINER
docker rm $CONTAINER
docker run -d --name=$CONTAINER $DOCKER_IMAGE"; then
echo "success"
也许还会考虑使用here文档(以便您可以在嵌入式脚本中使用单引号和双引号),并可能了解何时引用事物。只要您的变量不包含不规则的空格或通配符,它就可以正常工作,但这是不可思议的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句