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

Docker CMD命令在Azure容器实例运行异常,本地执行正常

Azure容器实例启动命令失效且无日志问题排查

问题现象

  • 本地Docker容器运行正常,Python启动命令可执行并生成日志
  • 部署到Azure容器实例后,启动命令无法正常运行,无法获取容器日志
  • 尝试将输出写入文件,Azure容器虽执行命令,但Python文件无输出;本地则正常
  • 手动进入Azure容器内部执行相同命令,可正常运行

相关配置文件

Dockerfile

FROM --platform=linux/amd64 ubuntu:20.04

ENV DEBIAN_FRONTEND noninteractive

# set default java environment variable
ENV JAVA_VERSION_MAJOR=8 \
    JAVA_VERSION_MINOR=111 \
    JAVA_HOME=/usr/lib/jvm/default-jvm \
    PATH=${PATH}:/usr/lib/jvm/default-jvm/bin/

RUN apt-get update && \
    apt-get upgrade -y && \
    apt install openjdk-11-jdk -yq && \
    apt install openjdk-17-jdk -yq 

RUN apt-get update && \
    apt install openjdk-8-jdk -yq && \
    ln -s /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/default-jvm && \
    apt-get clean all

# Check Java version
RUN java -version && \
    javac -version

# Install linux packages
RUN apt-get update
RUN apt-get -qq -y install software-properties-common git curl build-essential subversion perl wget unzip vim bc 

RUN apt-get install maven -yq

# Setup Apache Maven
ENV MAVEN_OPTS="-Xms256m -Xmx2048m"

# Check Maven version
RUN mvn -version

# Install Python
RUN add-apt-repository -y ppa:deadsnakes/ppa
RUN apt-get update
RUN apt-get install -y --no-install-recommends python3.9 python3.9-dev python3-pip python3-setuptools python3-wheel gcc
RUN python3.9 -m pip install pip --upgrade

RUN echo 'alias python=python3.9' >> /root/.bashrc

# RUN apt-get install pkg-config
# RUN apt-get install libcairo2-dev -yq

# RUN pip install argparse
# RUN pip freeze > requirements.txt
# RUN pip install -r requirements.txt

WORKDIR /root
COPY ./MOSALLISA-Testing /root/framework

ENV FRAMEWORK_HOME="/root/framework"
# COPY ../vimrc .vimrc
ENV JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
ENV TMP_DIR="/tmp"

ENV PYTHONIOENCODING=utf-8

# install Maven 3.8.1
RUN wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz -P /tmp 
RUN tar -xzvf /tmp/apache-maven-3.8.1-bin.tar.gz -C /opt

# install Maven 3.8.6
RUN wget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz -P /tmp
RUN tar -xzvf /tmp/apache-maven-3.8.6-bin.tar.gz -C /opt

# install gradle
RUN git config --global --add safe.directory '*'

# install python libraries
# COPY ../requirements.txt /tmp/requirements.txt
RUN python3.9 -m pip install --only-binary :all: numpy==1.21.4
RUN python3.9 -m pip install -r framework/Docker/requirements.txt

# non GHRB dependancies 
RUN pip install azure-storage-blob
RUN pip install python-dotenv


ENV EVOSUITE="/root/framework/MOSAllisaJars/evosuite-1.2.0.jar"
RUN echo "EVOSUITE during build: $EVOSUITE"
RUN echo 'alias evosuite="java -jar $EVOSUITE"' >> /root/.bashrc 

WORKDIR /root/framework

#This command is failing in Azure
CMD ["python3.9", "/root/framework/execute_results_testing.py"]

Azure容器实例启动脚本

REPOS=("sslcontext-kickstart")

for i in "${!REPOS[@]}"; do
  az container create \
    --resource-group $RESOURCE_GROUP \
    --name "mosalisa-t$i" \
    --image $IMAGE \
    --dns-name-label "mosallisat$i" \
    --environment-variables TEST_VERSION="REGRESSION_EVOSUITE" \
                            MOSALLISA_CONFIG="NORMAL" \
                            REPO="${REPOS[$i]}" \
                            AZ_STRGE_CONN_STR="$AZ_STRGE_CONN_STR" \
    --registry-username $REGISTRY_USERNAME \
    --registry-password $REGISTRY_PASSWORD \
    --memory $MEMORY
done

本地容器启动脚本

containername=$1

if [ -z "$containername" ]; then
    containername="mosallisa_framework"
fi

docker ps -aq --filter "name=$containername" | grep -q . && docker stop $containername && docker rm $containername

docker run -dt --name $containername -v $(pwd):/root/framework \
    -e TEST_VERSION="REGRESSION_EVOSUITE" \
    -e MOSALLISA_CONFIG="NORMAL" \
    -e REPO="sslcontext-kickstart" \
    -e AZ_STRGE_CONN_STR="$AZ_STRGE_CONN_STR" \
    mosallisa_framework:latest

# Execute bash inside the running container

排查方案与解决办法

1. 修复Python输出缓冲问题

Python在非交互式环境下会缓冲stdout/stderr,导致日志无法被Azure捕获。解决方式:

  • 修改Dockerfile中的CMD,添加-u参数关闭缓冲:
    CMD ["python3.9", "-u", "/root/framework/execute_results_testing.py"]
    
  • 或在Python代码中手动刷新输出:
    import sys
    print("日志内容", flush=True)
    

2. 验证文件完整性与权限

  • 确认构建镜像时,./MOSALLISA-Testing目录下的所有文件(包括execute_results_testing.py)都被正确复制到容器内/root/framework
  • 在Dockerfile中添加权限设置:
    RUN chmod +x /root/framework/execute_results_testing.py
    

3. 切换到shell模式执行CMD

使用shell模式执行命令,确保环境变量完整加载:

CMD python3.9 -u /root/framework/execute_results_testing.py

4. 查看Azure容器实例详细日志

通过Azure CLI获取更多诊断信息:

# 查看容器日志
az container logs --resource-group <你的资源组名称> --name <容器名称>

# 查看容器启动事件
az container show --resource-group <你的资源组名称> --name <容器名称> --query 'containers[0].instanceView.events'

5. 验证环境变量传递

在Python脚本开头添加代码,检查Azure传递的环境变量是否正常:

import os
print("当前环境变量:", os.environ)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:35:09