EC2启动脚本自动运行Docker容器失败:镜像已拉取但未启动
问题描述
期望启动EC2实例时自动运行指定Docker容器,为此配置了启动脚本。但脚本仅成功拉取Docker镜像,却无法启动容器;而单独在EC2终端执行该脚本时可正常运行。脚本内容如下:
#!/bin/bash sudo apt update sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker sudo apt install awscli -y aws ecr get-login-password --region eu-north-1 | sudo docker login --username AWS --password-stdin <password> sudo docker pull <image_name> sudo docker run -it -p 8080:8080 <image_name>
解决方案
移除
-it参数:启动脚本运行在非交互式环境中,-it会强制要求终端交互,导致容器无法正常启动。将docker run命令改为后台运行模式:sudo docker run -d -p 8080:8080 <image_name>其中
-d参数让容器在后台守护进程模式运行,适配启动脚本的非交互场景。等待Docker服务完全就绪:脚本中启动Docker服务后直接执行后续命令,可能存在服务未完全初始化的情况。添加等待逻辑确保Docker可用:
sudo systemctl start docker # 轮询等待Docker服务启动完成 until sudo docker info >/dev/null 2>&1; do sleep 2 done统一权限执行AWS CLI命令:启动脚本的执行环境可能没有EC2实例IAM角色的权限,导致
aws命令获取凭证失败。将aws命令也用sudo执行,确保权限一致:sudo aws ecr get-login-password --region eu-north-1 | sudo docker login --username AWS --password-stdin <你的ECR仓库URI>排查启动日志:如果问题仍存在,可通过日志定位具体错误。修改脚本添加日志输出,或者查看系统日志文件:
# 在docker run命令后添加日志记录 sudo docker run -d -p 8080:8080 <image_name> >> /var/log/container_init.log 2>&1之后可通过
cat /var/log/container_init.log或查看/var/log/cloud-init.log、/var/log/syslog获取更多报错信息。
内容的提问来源于stack exchange,提问作者Ish_codes_magic
相关产品推荐
相关产品推荐

