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

时间:2017-08-04 13:24:52

标签: python azure docker docker-container azure-dsvm

我有一个python应用程序,包含图像分析模型和2个脚本文件。在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张图像的方法。所以每个容器都需要有相同的设置。

任何想法?

2 个答案:

答案 0 :(得分:1)

首先,永远不要公开PORT 22并在容器内运行SSH。这不是推荐的事情

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

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

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

如果希望传递给容器运行命令的参数附加到ENTRYPOINT命令,则只能使用ENTRYPOINT。在您的情况下CMD应该这样做。

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

docker run -it -p 4000:8888 img_processing

答案 1 :(得分:0)

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