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
的信息 。