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

EC2实例UserData脚本未执行:Docker容器启动故障求助

问题分析与解决

你遇到的Unhandled non-multipart (text/x-not-multipart) userdata警告,核心是Cloud-Init无法正确识别Base64编码UserData的类型,或编码/格式不符合要求。结合你的测试情况,以下是具体排查和解决方向:

1. 给Base64编码的脚本添加MIME声明

Cloud-Init对Base64格式的UserData要求明确的MIME类型标识,否则会默认归类为无法处理的非多部分数据。

解决步骤:
在原始Shell脚本最顶部添加MIME头,再进行Base64编码:

Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

#!/bin/bash
# 原有脚本逻辑
# 等待HTTP服务就绪
until curl -s http://target-service:8080 > /dev/null; do
  sleep 10
done
# 启动Docker容器
docker run -e VAR1=value1 -e VAR2=value2 your-image:latest
# 关机
shutdown -h now

对包含MIME头的完整内容执行Base64编码。

2. 避免Base64编码生成换行符

多数默认Base64工具会自动插入换行符,这会导致Cloud-Init解析失败。

解决步骤:
使用无换行的编码方式:

# Linux/macOS环境
base64 -w 0 your-full-script.sh > encoded-data.txt

# Windows PowerShell
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content -Path your-full-script.sh -Raw)))

3. 确保脚本开头有正确的Shebang

虽然手动运行没问题,但Cloud-Init依赖#!/bin/bash或#!/bin/sh识别脚本类型,缺失可能触发类型识别错误。

解决步骤:
确认脚本第一行是#!/bin/bash(对应EC2实例默认Shell,比如Amazon Linux 2使用bash)。

4. 通过文件传入UserData避免命令行转义问题

直接在AWS CLI命令行粘贴Base64字符串,可能因长度或特殊字符被截断/转义,导致Cloud-Init无法解析。

解决步骤:
将编码后的内容保存到文件,用file://方式传入:

aws ec2 run-instances --user-data file://encoded-data.txt --image-id ami-xxxxxx --instance-type t2.micro ...其他参数

验证方法

  • 解码编码后的文件,检查是否和带MIME头的原始脚本完全一致
  • 查看/var/log/cloud-init.log,里面有更详细的UserData解析日志,可确认MIME类型是否被正确识别

内容的提问来源于stack exchange,提问作者OOKWUDILI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:13