Docker 容器在 运行 之后存在且日志中没有错误
Docker Container Existing after run with no error in log
我有一个 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 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 张图像的方法。所以每个容器都需要有相同的设置。
有什么想法吗?
你可以ENTRYPOINT ["python", "Main.py"]
。这会将 python Main.py
设置为容器的默认命令。您可以在 Dockerfile documentation.
中阅读更多关于 ENTRYPOINT
的信息
首先,永远不要在容器内暴露端口 22 和 运行 SSH。不推荐这样做
接下来您可以将 ENTRYPOINT 或 CMD 指定为
CMD ["python", "Main.py"]
为此,您需要确保 Main.py
在您指定的 WORKDIR
的当前目录中
只有当您希望将传递给容器的参数 运行 命令附加到 ENTRYPOINT
命令时,您才可以使用 ENTRYPOINT
。在您的情况下 CMD
应该可以。
当您的容器立即退出时,您应该删除 -d
标志并使用 -it
标志来调试问题
docker run -it -p 4000:8888 img_processing
我有一个 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 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 张图像的方法。所以每个容器都需要有相同的设置。
有什么想法吗?
你可以ENTRYPOINT ["python", "Main.py"]
。这会将 python Main.py
设置为容器的默认命令。您可以在 Dockerfile documentation.
ENTRYPOINT
的信息
首先,永远不要在容器内暴露端口 22 和 运行 SSH。不推荐这样做
接下来您可以将 ENTRYPOINT 或 CMD 指定为
CMD ["python", "Main.py"]
为此,您需要确保 Main.py
在您指定的 WORKDIR
的当前目录中
只有当您希望将传递给容器的参数 运行 命令附加到 ENTRYPOINT
命令时,您才可以使用 ENTRYPOINT
。在您的情况下 CMD
应该可以。
当您的容器立即退出时,您应该删除 -d
标志并使用 -it
标志来调试问题
docker run -it -p 4000:8888 img_processing