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
相关产品推荐
相关产品推荐

