Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在容器中运行Docker脚本应用程序_Python_Docker_Redis - Fatal编程技术网

Python 在容器中运行Docker脚本应用程序

Python 在容器中运行Docker脚本应用程序,python,docker,redis,Python,Docker,Redis,我是Docker和containers的新手——我有一个Python 3脚本,它根据命令行参数从网站提取数据并打印结果。如果没有可用的网络连接,它将使用Redis缓存数据。我的Dockerfile是这样的 FROM ubuntu:latest RUN apt-get update -y && apt-get -y install redis-server && apt-get install -y python3-pip python3.5-dev build-e

我是Docker和containers的新手——我有一个Python 3脚本,它根据命令行参数从网站提取数据并打印结果。如果没有可用的网络连接,它将使用Redis缓存数据。我的Dockerfile是这样的

FROM ubuntu:latest
RUN apt-get update -y && apt-get -y install redis-server && apt-get install -y python3-pip python3.5-dev build-essential
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["pn.py"]
我能够构建映像,但是当我启动容器时,它可能会运行Python命令在容器内运行脚本并退出,因此我无法看到来自主机的结果

脚本需要命令行输入,否则将失败。如何将它们指定为我可以用于从主机运行脚本的单个Docker run命令的一部分


或者,如何在不调用脚本的情况下启动容器,而是在正在运行的容器中手动运行脚本?

这取决于您希望对结果执行什么操作

假设如下:

  • ENTRYPOINT
    行告诉图像启动容器时应该执行什么。这将是
    PID 1
  • 当该行存在时,
    CMD
    内容用作
    入口点的参数
  • docker容器总是在其主任务(PID 1)退出时退出
基本上,你的码头工人是在做它被要求做的事情。如果您想让它继续运行,您应该给出一个不会作为
ENTRYPOINT
CMD
退出的任务(如果
ENTRYPOINT
不存在)

要在
shell
模式下手动启动容器并查看发生了什么,可以按以下方式运行:

docker run -ti [OPTIONS] [CONTAINER_NAME] bash
然后,您将在一个shell中“插入”容器,因此您可以手动运行脚本:

#~ python3 pn.py

好的,谢谢。
Dockerfile
第二行中的命令
apt get-y install redis server
应该安装
redis server
并自动启动,但这不起作用。进入容器后,
服务redis服务器状态
告诉我它没有运行。即使在我更改了
Dockerfile
以添加额外的行
service redis server restart
之后,也会发生这种情况。我如何解决这个问题?您误解了
Dockerfile
的概念。您无法获得从一条线路到另一条线路的服务。
Dockerfile
创建一个由一个或多个
层组成的
docker图像
Dockerfile
的每一行都会创建一个新层。将其视为类的静态成员,生成的图像就是一个类。使用此图像运行的容器是此类的实例或对象。在使用Dockerfile构建映像时,不能期望服务继续运行。此外,我会将行
RUN-apt-get-update-y&&apt-get-y安装redis服务器&&apt-get-install-y python3.5-dev-build-essential
更改为
RUN-apt-get-update&&apt-get-y安装redis服务器python3.5-dev-build-essential
,以简化。