安装Jenkins的AWS EC2实例执行Maven构建时失联问题排查
问题描述
在基于RedHat系统的AWS EC2实例上,通过docker-compose部署Jenkins,安全组已开放全部HTTP和SSH流量。执行简单测试任务时,Jenkins可正常从GitHub拉取代码并执行Jenkinsfile中的Shell命令;但启动包含Maven构建的任务后,EC2实例彻底无法访问——本地终端SSH连接失败,AWS Connect也无法连接。AWS控制台显示实例状态为“健康”,重启实例也无法解决问题。
已确认jenkins_home目录已创建,尝试过将$PWD替换为绝对路径,且Jenkins能正常拉取GitHub代码,因此排除安全组问题。希望找出该问题的根本原因,而非直接更换Jenkins安装方式。
原docker-compose.yml配置如下:
version: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins ports: - "80:8080" volumes: - "$PWD/jenkins_home:/var/jenkins_home" networks: - net networks: net:
问题原因与解决方案
经排查,问题根源是EC2实例资源耗尽:物理内存不足且未配置Swap空间。Swap是物理内存耗尽时可临时使用的磁盘空间,配置后可有效缓解内存压力,避免实例因内存占满而失去响应。
诊断流程
- 登录Jenkins后台,依次进入
Manage Jenkins>Manage Nodes and Clouds,查看Built-In Node的Free Swap Space,若显示为0,说明要么宿主机未配置Swap,要么Docker中Jenkins以非特权模式运行,无法访问宿主机的Swap空间。 - 检查宿主机Swap配置:
执行以下命令:
free | grep -i Swap
若输出为Swap: 0 0 0,说明宿主机未配置Swap;也可直接执行swapon命令查看Swap状态。
解决步骤
1. 为宿主机配置Swap文件
sudo fallocate -l 2G /swapfile # 可根据实例规格替换2G为合适的大小 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo vi /etc/fstab # 在文件末尾添加一行,确保Swap开机自动挂载 /swapfile swap swap defaults 0 0 # 验证Swap配置是否生效 sudo free -h
2. 更新docker-compose.yml配置
确保Jenkins服务开启特权模式,以下是完整的配置示例:
version: "3.8" services: jenkins: image: jenkins/jenkins:lts privileged: true user: root ports: - 8080:8080 - 50000:50000 container_name: jenkins volumes: - /home/ec2-user/jenkins_compose/jenkins_configuration:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock agent: image: jenkins/ssh-agent:jdk11 privileged: true user: root container_name: agent expose: - 22 environment: - JENKINS_AGENT_SSH_PUBKEY=你的SSH连接公钥
3. 重启Docker容器
sudo docker compose down # 若使用旧版Docker,执行 sudo docker-compose down sudo docker compose up -d
内容的提问来源于stack exchange,提问作者nikiforov.java
相关产品推荐
相关产品推荐

