You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:49:51