【问题标题】:Want to run python script and Flask api from single Dockerfile想要从单个 Dockerfile 运行 python 脚本和 Flask api
【发布时间】:2020-06-10 13:46:05
【问题描述】:

我正在尝试使用以下 docker 文件创建容器。由于它将执行最后一个 CMD,它忽略了CMD ["sh", "-c", "python3 run_scheduler.py --config=${config}"]。 有没有办法从单个 docker 文件运行两者。另外,是否可以将${config} 参数传递给CMD ["gunicorn", "--bind", "0.0.0.0:5000", "run_api:application", "&"] 中的flask api

FROM python:3.8

LABEL version="0.1"

WORKDIR /app
COPY . /app

ARG config=dev
RUN  pip install -r requirements.txt
EXPOSE 5000
CMD ["sh", "-c", "python3 run_scheduler.py --config=${config}"]
CMD ["gunicorn",  "--bind", "0.0.0.0:5000",  "run_api:application", "&"]

【问题讨论】:

  • 查看此 SO 帖子:serverfault.com/questions/685697/…
  • 您可以在运行容器时指定备用命令(在 docker run 中的映像名称之后;作为 Docker Compose command:)。使用两个单独的命令运行两个单独的容器。

标签: python docker gunicorn


【解决方案1】:

如 cmets 中所述,您可以在 CMD 中传递 2 行 bash 脚本。然而,这可能会导致问题。 Docker 并不是真的要在单个容器中运行多个进程。我已经在您的第二个 CMD 中看到了“&”参数。我猜你遇到了第二个进程没有运行的问题,所以你试图将它推到后台。

Docker推荐的解决方案是在容器内运行supervisordhttps://docs.docker.com/config/containers/multi-service_container/

从命名概念我猜你可以用 Flask-APScheduler https://github.com/viniciuschiele/flask-apscheduler 解决你的问题 这样您就可以摆脱第二个 sidecar 脚本。

最后你问:

另外,是否可以将 ${config} 参数传递给烧瓶 api

答案是肯定的。在 Dockerfile 中声明 ENV,如下所示:

FROM python:3.8
...
...
ENV config foo
...
CMD ["whatever_command", "--option", "${config}"]

这样"${config}" 将被替换为值foo

【讨论】:

  • 感谢您的帮助。我确实创建了 2 个容器。为我的用例工作。使用以下 docker compose。 version: '3' services: api: build: context: . dockerfile: Dockerfile command: ["gunicorn", "--bind", "0.0.0.0:5000", "run_api:application", "&"] ports: - "5000:5000" scheduler: build: context: . dockerfile: Dockerfile command: ["sh", "-c", "python3 run_scheduler.py --config=dev"] ports: - "80:80"
  • 我还需要将 --config=dev 传递给命令:["gunicorn", "--bind", "0.0.0.0:5000", "run_api:application", "&"] .我需要使用这个变量来选择 Flask Api 中的配置。我知道我可以将其作为命令中的 arg 传递,但如何在我的烧瓶 api(run_api:应用程序)中访问。
  • 您需要使用 os 模块:from os import getenv 并使用 getenv 来获取您的环境变量。看看docs.python.org/3.8/library/os.html#os.getenv
  • 谢谢,“from os import getenv and use getenv”确实解决了这个问题。
猜你喜欢
  • 2021-11-22
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2021-08-26
  • 1970-01-01
  • 2019-10-19
  • 2016-04-05
相关资源
最近更新 更多