我有一个尝试创建docker映像,将其上传到docker hub的管道,然后我SSH到EC2实例并运行将下载该映像并启动容器的shell脚本。
问题在于,当shell脚本完成下载docker映像并尝试启动容器时,管道认为部署成功。但是,容器可能存在问题(它是Node JS应用程序,有时会出现阻止其编译的错误)。
理想情况下,我想添加到Shell脚本中,以便管道检查以确保容器实际上已启动并正在运行。
下面是到目前为止的脚本。我正在考虑提取新启动的容器的状态,并查看它是否正在运行或具有退出代码(1)作为状态。我知道图片,但是无法获取容器ID(这不起作用:Get docker container id from container name)
或者有更好的方法吗?
echo "Starting Docker container replacement script"
ENV=$1
USERNAME=$2
echo "this is the env: ${ENV}"
if [ $ENV = "dev" ]; then
PORT=9111
CMD="npm run dev"
elif [ $ENV = "dev2" ]; then
PORT=9222
CMD="npm run dev2"
elif [ $ENV = "dev3" ]; then
PORT=9333
CMD="npm run dev3"
else
echo "ERROR: No valid environment parameter was passed"
exit 1
fi
for i in $(docker ps -a -q --filter ancestor=someaccount/registry:$ENV); do docker rm $(docker stop $i); done
docker rmi someaccount/registry:$ENV
cat docker_pass.txt | docker login -u $USERNAME --password-stdin
docker pull someaccount/registry:$ENV
docker run -p $PORT:7665 -d someaccount/registry:$ENV $CMD
echo "Finishing script"
答案 0 :(得分:1)
您可以向Docker映像添加Healthcheck。如果您不想将其放入映像中,也可以在命令行上指定它。基本上,这告诉Docker运行什么命令以及检查容器是否仍然正常工作的频率。
例如,从文档中,您可以每5分钟检查一次容器中的网站是否显示以下内容:
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
然后您可以检查运行状况:
docker inspect --format='{{json .State.Health}}' <container-id>
使用-d
标志运行docker时,它将容器ID输出到标准输出。