M1芯片设备上Docker容器构建随机挂起问题求助
M1芯片设备上Docker构建随机挂起问题
问题现象
原本在非M1设备上稳定运行多年的Dockerfile,更换M1芯片设备后,构建时有50%以上概率随机挂起,最常卡在以下步骤:
RUN sed -i -e 's/\r$//' ./wildfly-command.sh
偶尔也会在其他步骤挂起,当卡在上述相关流程时,会看到输出==> Shutting down WildFly...后停止响应。
相关文件内容
wildfly-command.sh
#!/bin/bash JBOSS_HOME=/opt/jboss/wildfly JBOSS_CLI=$JBOSS_HOME/bin/jboss-cli.sh JBOSS_MODE=${1:-"standalone"} JBOSS_CONFIG=${2:-"$JBOSS_MODE.xml"} function wait_for_wildfly() { until `$JBOSS_CLI -c "ls /deployment" &> /dev/null`; do sleep 1 done } echo "==> Starting WildFly..." $JBOSS_HOME/bin/$JBOSS_MODE.sh -c $JBOSS_CONFIG & echo "==> Waiting..." wait_for_wildfly echo "==> Setup Datasource..." $JBOSS_CLI -c --file=`dirname "$0"`/module-install.cli echo "==> Shutting down WildFly..." if [ "$JBOSS_MODE" = "standalone" ]; then $JBOSS_CLI -c ":shutdown" else $JBOSS_CLI -c "/host=*:shutdown" fi
Dockerfile
ARG PLATFORM FROM --platform=$PLATFORM quay.io/wildfly/wildfly # Install Maven USER root #RUN yum install -y maven && yum clean all # Install necessary packages RUN yum -y install wget # Download and extract Maven RUN wget https://downloads.apache.org/maven/maven-3/3.9.1/binaries/apache-maven-3.9.1-bin.tar.gz -P /tmp \ && tar xf /tmp/apache-maven-3.9.1-bin.tar.gz -C /opt \ && ln -s /opt/apache-maven-3.9.1 /opt/maven \ && rm /tmp/apache-maven-3.9.1-bin.tar.gz # Set Maven environment variables ENV MAVEN_HOME /opt/maven ENV PATH ${MAVEN_HOME}/bin:${PATH} # Set Postgresql env variables ENV DB_HOST postgres ENV DB_PORT 5432 ENV DB_NAME postgres ENV DB_USER postgres ENV DB_PASS gjAFk3!Rk2#!lapA@ ENV hbm2ddl create ENV DS_NAME PostgresXADS ENV JNDI_NAME java:jboss/PostgresXADS ADD https://jdbc.postgresql.org/download/postgresql-42.6.0.jar /tmp/postgresql-42.6.0.jar WORKDIR /tmp COPY input_files/wildfly-command.sh ./ COPY input_files/module-install.cli ./ RUN sed -i -e 's/\r$//' ./wildfly-command.sh RUN chmod +x ./wildfly-command.sh RUN ./wildfly-command.sh \ && rm -rf $JBOSS_HOME/standalone/configuration/standalone_xml_history/ # Build the war COPY pom.xml ./ COPY src ./src/ RUN mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true # Add deployments ADD target/cryptonews-1.1.war /opt/jboss/wildfly/standalone/deployments/ RUN /opt/jboss/wildfly/bin/add-user.sh admin P@ssword --silent CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]
解决办法
针对M1芯片上Docker构建随机挂起的问题,试试从这几个方向调整:
1. 修复WildFly启动/关闭的阻塞问题
从现象看,挂起常卡在wildfly-command.sh的关闭环节,大概率是arm64架构下WildFly的CLI命令没响应或者超时。给脚本加个超时机制,同时增强关闭逻辑:
修改wildfly-command.sh里的wait_for_wildfly函数和关闭部分:
function wait_for_wildfly() { local timeout=30 local count=0 # 最多等30秒,避免无限等待 until `$JBOSS_CLI -c "ls /deployment" &> /dev/null` || [ $count -ge $timeout ]; do sleep 1 count=$((count+1)) done if [ $count -ge $timeout ]; then echo "ERROR: WildFly启动超时了" exit 1 fi } # 关闭WildFly时,如果CLI命令失败,直接杀进程 echo "==> Shutting down WildFly..." if [ "$JBOSS_MODE" = "standalone" ]; then $JBOSS_CLI -c ":shutdown" || pkill -f "$JBOSS_MODE.sh" else $JBOSS_CLI -c "/host=*:shutdown" || pkill -f "$JBOSS_MODE.sh" fi
2. 优化平台兼容性
- 构建时明确指定平台,避免Docker自动适配出问题:
用这个命令构建:
或者直接在Dockerfile里固定平台(如果不需要跨平台):docker build --platform=linux/amd64 -t 你的镜像名 .FROM --platform=linux/amd64 quay.io/wildfly/wildfly - 检查
quay.io/wildfly/wildfly有没有官方arm64版本,优先用对应架构的镜像,减少模拟层的bug和性能问题。
3. 调整Docker Desktop设置
在M1的Docker Desktop里改这些设置试试:
- 增加CPU和内存分配(偏好设置→资源),避免构建时资源不够卡壳。
- 关掉"Use the new Virtualization framework"选项(有些旧版WildFly在这个框架下有兼容问题)。
- 打开"Rosetta for x86/amd64 emulation on Apple Silicon",提升x86镜像的模拟性能。
4. 合并构建步骤
把wildfly-command.sh的处理和执行合并成一个RUN命令,减少Docker层的交互:
WORKDIR /tmp COPY input_files/wildfly-command.sh ./ COPY input_files/module-install.cli ./ RUN sed -i -e 's/\r$//' ./wildfly-command.sh \ && chmod +x ./wildfly-command.sh \ && ./wildfly-command.sh \ && rm -rf $JBOSS_HOME/standalone/configuration/standalone_xml_history/
内容的提问来源于stack exchange,提问作者user3362334
相关产品推荐
相关产品推荐

