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

我有一个由图像分析模型和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() 

我的Dcoker文件是:

 # 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的天青数据科学虚拟机。

我build立了我的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和我的容器内部我pipe理的东西和运行python Main.py &在后台运行脚本,我不认为是一个好方法。 特别是我必须find放大和处理3000张图像的方法。 所以每个容器需要有相同的设置。

任何想法?

首先不要暴露PORT 22并在容器内部运行SSH。 这不是一个推荐的事情

接下来,您可以指定入口点或CMD

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

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

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

当您的包含立即退出时,您应该删除-d标志并使用-it标志来debugging问题

 docker run -it -p 4000:8888 img_processing 

你可以做ENTRYPOINT ["python", "Main.py"] 。 这将设置python Main.py作为容器的默认命令。 您可以在Dockerfile 文档中阅读更多关于ENTRYPOINT的信息 。