我有一个管道,它尝试创建一个 docker 镜像,将其上传到 docker hub,然后我通过 SSH 连接到 EC2 实例并运行一个 shell 脚本,该脚本将下载映像并启动一个容器。
问题是,当 shell 脚本完成下载 docker 映像并尝试启动容器时,管道认为部署成功。但是,容器可能存在问题(它是一个 Node JS 应用程序,有时会出现阻止它编译的错误)。
理想情况下,我想添加到 shell 脚本中,以便管道检查以确保容器实际启动并运行。
以下是到目前为止的脚本。我正在考虑提取新启动的容器的状态,看看它是否正在运行或将退出代码 (1) 作为状态。我知道映像,但无法获取容器 ID(这不起作用:从容器名称获取 docker 容器 ID)
还是有更好的方法可以做到这一点?
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"
您可以向 Docker 映像添加运行状况检查。 如果您不想将其放在映像中,也可以在命令行上指定。 基本上,这告诉 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 输出到标准输出。