【问题标题】:flask app not running automatically from Dockerfile烧瓶应用程序未从 Dockerfile 自动运行
【发布时间】:2022-01-25 09:19:41
【问题描述】:

当我在 docker 中运行时,我的简单烧瓶应用程序不会自动启动,尽管我已经正确添加了 CMD 命令。我可以从容器外壳手动使用 python3 /app/app.py 运行烧瓶。因此,代码或命令没有问题

FROM     ubuntu:latest
RUN      apt-get update
RUN      apt-get install -y gcc libffi-dev libssl-dev
RUN      apt-get install -y libxml2-dev xmlsec1
RUN      apt-get install -y python3-pip python3-dev
RUN      pip3 --no-cache-dir install --upgrade pip
RUN      rm -rf /var/lib/apt/lists/*
RUN      mkdir  /app
WORKDIR  /app
COPY     .  /app
RUN      pip3 install -r requirements.txt
EXPOSE   5000        
CMD     ["/usr/bin/python3", "/app/app.py"]

我运行 docker 容器

docker run -it okta  /bin/bash

当我登录到 docker 容器并在容器的 Ubuntu shell 上运行“ps -eaf”时,我看不到烧瓶进程正在运行。所以我的问题是为什么下面的行在 Dockerfile 中不起作用?

CMD     ["/usr/bin/python3", "/app/app.py"]

【问题讨论】:

  • 是什么让您认为您的烧瓶应用程序没有运行?启动 docker 容器时会发生什么?而你希望发生什么?
  • 当我启动容器并登录到 Ubuntu 容器然后在终端中检查“ps -eaf”时,我看到烧瓶应用程序没有运行。然后我使用 python3 /app/app.py 手动启动它,理想情况下 CMD ["/usr/bin/python3", "/app/app.py"] 应该在你运行容器后立即运行你的命令,但这不是正在发生。
  • 请编辑您的问题以表明这一点。另外,当你向烧瓶服务器发出请求时会发生什么?
  • 显然,当没有运行烧瓶服务器时,您会从网络浏览器收到错误消息。我什至不需要查看浏览器端。我的问题是为什么服务器一开始就没有运行?
  • 仔细检查仍然是个好主意。

标签: python docker flask


【解决方案1】:

运行您的 docker 容器传递命令 /bin/bash 会覆盖 CMD ["/usr/bin/python3", "/app/app.py "] 在你的 Dockerfile 中。

CMD vs ENTRYPOINT 解释Here

尝试将 Dockerfile 的最后一行更改为

ENTRYPOINT ["/usr/bin/python3", "/app/app.py"]

更改后不要忘记重建图像。

或者...您可以从 docker run 命令的末尾省略 /bin/bash 并查看您的 app.py 是否成功启动。

【讨论】:

  • 是的,谢谢。顺便说一句,使用 ENTRYPOINT 而不是 CMD 有什么魔力?你能简单地告诉我吗?
  • ENTRYPOINT 命令始终执行,无论您在运行容器时传递什么参数。当您使用 /bin/bash/ 之类的参数运行容器时,CMD 被设计为被覆盖。我发布的链接可能会更好地解释它。如果答案有用,请标记为已回答,以便其他人得到帮助。
  • 没有理由将CMD 更改为ENTRYPOINT。如果您需要,这只会使运行备用命令变得更加困难。从docker run 命令中删除bash 命令覆盖就足够了。
猜你喜欢
  • 2018-12-13
  • 2015-07-05
  • 2015-02-12
  • 2018-10-25
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多