Docker CMD 命令的行为与本地开发不同

问题描述 投票:0回答:1

我对 Docker 和 Azure 还很陌生,但是当我将容器部署到容器实例时,启动命令似乎不起作用;我不知道为什么。我没有收到来自 Azure 容器的日志。

Docker 文件

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"]


启动容器实例bash文件

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

我尝试在本地运行它,它按预期工作并生成日志。我还尝试在启动期间手动记录到文件,azure 容器启动命令,但 python 文件不输出任何内容,本地运行的版本也能够输出到日志文件。我手动进入容器并运行相同的命令,效果很好。

azure docker
1个回答
0
投票

同意@Vivek Vaibhav Shandilya 的评论。

  • 在 Docker 容器中,当主脚本完成时,容器将停止。这可能会导致容器循环重新启动。
  • 为了阻止这种情况发生,我们需要在脚本完成后保持容器运行。 我已将此命令
    tail -f /dev/null
    添加到您的代码末尾,如下所示。
CMD ["python3.9", "/root/framework/execute_results_testing.py", "&&", "tail", "-f", "/dev/null"]
  • 感谢 @kodekloud 的清晰解释,我参考了这个 doc 以更好地了解如何保持 docker 容器运行。 您可以将该命令添加到 Dockerfile 或 shell 脚本中,如下所示。

开始.sh

echo  "Executing Python script..."
python3.9  /root/framework/execute_results_testing.py  
echo  "Python script finished. Keeping container alive..."
tail  -f  /dev/null

本地日志:

enter image description here

进行上述更改后,我的容器成功保持活动状态而无需重新启动。

来自 Azure 容器实例的日志:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.