2017-08-04 53 views
2

我有一个由图像分析模型和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虚拟机。

我建我的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张图像的方法。所以每个容器需要有相同的设置。

任何想法?

回答

1

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

接下来,您可以指定任何入口点或CMD作为

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

为此,您需要确保Main.py是在您指定的WORKDIR的当前目录

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

当您退出包含立即应删除-d标志和使用-it标志调试问题

docker run -it -p 4000:8888 img_processing 
0

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