如何通过Dockerfile在Docker容器启动时运行jboss-cli命令
问题分析
你遇到的这个连接错误,根源主要有两个:
- Docker
CMD指令的特性:Dockerfile里如果定义多个CMD,只有最后一条会生效。所以你的WildFly服务根本没启动,容器直接执行了jboss-cli.sh命令,自然连不上管理端口。 - 服务启动的时序问题:就算把启动命令和jboss-cli命令合并,WildFly启动需要时间,管理端口9990不会立刻就绪,直接执行jboss-cli肯定会因为连接失败报错。
解决方案
我们需要用一个启动脚本来统一控制流程:先启动WildFly,等待管理端口就绪后再执行jboss-cli命令,最后保持WildFly进程在前台运行(避免容器退出)。
步骤1:创建启动脚本
在项目目录下新建start-wildfly.sh脚本,内容如下:
#!/bin/bash # 后台启动WildFly /opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 & # 等待WildFly管理端口9990就绪 echo "等待WildFly管理端口就绪..." until nc -z localhost 9990; do sleep 2 done # 执行jboss-cli的模块添加命令 echo "开始执行jboss-cli命令..." /opt/jboss/wildfly/bin/jboss-cli.sh -c controller=localhost:9990 --user=admin --password=admin --command="module add --name=com.mysql --resources=/opt/jboss/mysql-connector-java-5.1.44.jar --dependencies=javax.api,javax.transaction.api" # 将WildFly进程拉回前台,维持容器运行 wait $!
给脚本添加执行权限:
chmod +x start-wildfly.sh
步骤2:修改Dockerfile
更新Dockerfile,复制启动脚本并设置为容器启动命令:
FROM jboss/wildfly:latest USER jboss COPY mysql-connector-java-5.1.44.jar /opt/jboss/ RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent USER root RUN chown jboss:root /opt/jboss/mysql-connector-java-5.1.44.jar # 复制并配置启动脚本 COPY start-wildfly.sh /opt/jboss/ RUN chown jboss:root /opt/jboss/start-wildfly.sh && chmod +x /opt/jboss/start-wildfly.sh USER jboss # 设置启动脚本为容器启动命令 CMD ["/opt/jboss/start-wildfly.sh"]
步骤3:构建并运行容器
重新构建镜像:
docker build -t wildfly-ci .
启动容器:
docker run --name=wildfly-ci -p 8080:8080 -p 9990:9990 wildfly-ci
额外说明
- 脚本里用
nc(netcat)检测端口状态,WildFly官方镜像默认自带这个工具;如果你的镜像没有,可以在Dockerfile中添加RUN yum install -y nc(CentOS系)或RUN apt-get install -y netcat(Debian系)来安装。 - 最后用
wait $!维持WildFly进程在前台,确保容器不会因为脚本执行完成就退出。
内容的提问来源于stack exchange,提问作者Welton Leão Machado
相关产品推荐
相关产品推荐

