【问题标题】:Flask container is not up and running using dockerFlask 容器未启动并使用 docker 运行
【发布时间】:2019-06-18 21:07:02
【问题描述】:

所以我的问题很简单,但仍然无法控制它,并且它的表现不像我想要的那样。

示例 docker 文件:

FROM ubuntu:16.04

RUN apt-get update -y && \
    apt-get install -y python3-pip python3-dev
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip3 install -r requirements.txt
COPY . /
RUN chmod a+x start.sh
EXPOSE 5000
CMD ["./start.sh"]

样本start.sh

#!/usr/bin/env bash

# sleep 600
nohup python3 /code/app.py &
python3 /code/helloworld_extract.py

示例烧瓶 app.py

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return """
  <h1>Python Flask in Docker!</h1>
  <p>A sample web-app for running Flask inside Docker.</p>
  """


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')

所以,我的问题是,一旦我构建映像并运行它, docker run --name flaskapp -p5000:5000 docker-flask:latest...我无法访问 localhost:5000。 如果我进入容器并使用 python3 app.py 运行显式 nohup 命令。我可以到达本地主机。

那么,为什么我无法使用运行命令访问 localhost 主机?

问题是我需要运行 2 个脚本,一个是 flask,另一个是 helloworld_extract.py,它在将一些信息写入文件后最终退出。

【问题讨论】:

  • 你的主容器进程(也就是helloworld_extract.py)退出了吗?你确定你不想要两个容器吗?
  • 是的......它确实退出了。不,helloworld_extract 只是一个为烧瓶应用程序提供内容的抓取脚本。初始化后。

标签: python-3.x docker flask


【解决方案1】:

当你的start.sh 脚本说

#!/bin/sh
do_some_stuff_in_the_background &
some_foreground_process

容器的整个生命周期都与some_foreground_process 相关联。在您的情况下,由于您澄清它正在执行一些初始数据加载并退出,因此一旦退出,start.sh 脚本就完成了,因此容器退出。

(作为一般规则,尽量避免在 Docker 领域使用 nohup&amp;,因为这会导致类似这样的混乱问题。)

我建议将主容器进程设置为 Flask 服务器。

CMD ["python3", "/code/app.py"]

您没有说出加载程序脚本中的内容。由于它的生命周期与主应用程序完全不同,因此单独运行它是有意义的;您可以将 CMD 替换为 docker run 选项。假设您需要在文件系统中填充一些共享数据。你可以:

# Build the image
docker build -t myimage .

# Create a (named) shared filesystem volume
docker volume create extract

# Start the Flask server
docker run -d -p 5000:5000 -v extract:/data myimage

# Run the script to prepopulate the data
docker run -v extract:/data myimage python3 /code/helloworld_extract.py

请注意,所有命令都使用相同的卷名extract。路径名称 /data 是任意选择,但由于两个命令在同一个图像上运行,因此它们具有相同的文件系统布局是有道理的。

【讨论】:

  • 你是对的,感谢您的洞察力,这个 helloworld_extract 的生命周期与主应用程序不同。但是你能建议一下,如果这个 helloworld_extract.py 是主应用程序的一部分,应该怎么做?
  • “主应用程序的一部分”是什么意思?您可以在docker run 末尾传递任何命令行来运行它,以覆盖图像的 CMD。
猜你喜欢
  • 2019-11-13
  • 2014-02-06
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2023-03-30
  • 2016-10-19
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多