Skip to main content
 首页 » 编程设计

python之运行后 Docker 容器存在,日志中没有错误

2025年02月15日30txw1958

我有一个由图像分析模型和 2 个脚本文件组成的 Python 应用程序。在 Main.py 中,我有 XMLRPC 服务器永远运行以监听客户端。

if __name__ == "__main__": 
    server = SimpleXMLRPCServer(("0.0.0.0", 8888)) 
    print("Listening on port 8888...") 
    server.register_function(result, "result") 
    server.serve_forever() 

我的 Dcokerfile 是:

# Start with NVIDIA's CUDA and cuDNN base image. 
FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 
 
# Argument: the username & password. 
ARG username 
ARG user_password 
 
# Update the system. 
RUN echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections 
RUN apt-get update 
RUN apt-get upgrade --assume-yes 
 
...... bla bla bla 
 
WORKDIR /home/${username} 
 
# Copy the current directory contents into the container at /home/${username} 
ADD . /home/${username} 
 
...... bla bla bla 
 
# Expose the ports and start the ssh daemon as entry point. 
USER root 
EXPOSE 22 6006 8888 
ENTRYPOINT ["/usr/sbin/sshd", "-D"] 

当我添加 CMD 运行我的 Main.py 容器不工作,它立即退出。 我能够运行此容器的最佳实践是什么?我正在为 Linux Ubuntu 使用 azure Data Science Virtual Machine。

我构建了我的 Dockerfile:

 docker build . --tag img_processing:V1 --build-arg "username=blabla" --build-arg "user_password=blabla" 

然后我运行我的容器:

docker run -d -p 4000:8888 img_processing 

目前我使用 docker exec -it my-app-container bash 在我的容器内部我管理东西并运行 python Main.py & 来运行脚本我认为这不是一个好方法的背景。 尤其是我必须找到一次放大和处理 3000 张图像的方法。所以每个容器都需要有相同的设置。

有什么想法吗?

请您参考如下方法:

首先,永远不要暴露端口 22 并在容器内运行 SSH。不推荐这样做

接下来您可以将 ENTRYPOINT 或 CMD 指定为

CMD ["python", "Main.py"] 

为此,您需要确保 Main.py 位于您指定的 WORKDIR 的当前目录中

只有当您希望将传递给容器运行命令的参数附加到 ENTRYPOINT 命令时,您才可以使用 ENTRYPOINT。在你的情况下 CMD 应该做。

当您的容器立即退出时,您应该删除 -d 标志并使用 -it 标志来调试问题

docker run -it -p 4000:8888 img_processing