【问题标题】:Set environemnt variables on Dockerfile, flask server not working在 Dockerfile 中设置环境变量,烧瓶服务器不起作用
【发布时间】:2020-08-02 17:43:47
【问题描述】:

我需要在我的 Dockerfile 中设置环境(我不能使用 docker-compose,因为我需要这个 dockerfile 用于 kubernetes)。 这是我的 Dockerfile:

FROM tensorflow/tensorflow:2.1.0-py3

RUN apt -qq -y update \
    && apt -qq -y upgrade

WORKDIR /socialworks-api
COPY . /socialworks-api

RUN python -m pip install --upgrade pip

RUN apt -y install git

#for mysql
RUN apt install -y libmysqlclient-dev

RUN pip --no-cache-dir install -r requirements.txt
EXPOSE 5000
CMD ["/bin/bash", "./start.sh"]

这是我的 start.sh 文件:

#!/bin/bash
export $(grep -v '^#' env/docker.env | xargs)
source env/docker.env
python app.py

这是我在 app.py 中启动烧瓶服务器的地方:

if __name__ == '__main__':
    print("test")
    socketio.run(app, host="0.0.0.0", debug=True, use_reloader=False)

问题是,在这些命令之后,我尝试运行我的 docker 容器并且正在启动烧瓶服务器(它甚至在终端中打印测试),当我尝试运行 http://0.0.0.0:5000/ 时,我无法连接问题在浏览器上。 也许问题出在我的 dockerfile 或 start.sh 文件中的 CMD 上?我是 Docker 新手。任何帮助将不胜感激。本地一切正常。 这是我用来运行 docker 容器的命令:

docker run -it flaskapp

这里是 docker ps:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
337f1bdacb3e        flaskapp            "/bin/bash ./start.sh"   44 seconds ago      Up 42 seconds       5000/tcp            dazzling_mcclintock

这里是日志:

docker logs 337f1bdacb3e
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt.zip.
2020-04-20 10:02:44.287504: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-04-20 10:02:44.309581: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2394225000 Hz
2020-04-20 10:02:44.310031: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x4971910 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-04-20 10:02:44.310068: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
test
(10) wsgi starting up on http://0.0.0.0:5000

日志与我在本地运行时得到的相同,并且在本地一切正常。可能是烧瓶应用程序在运行时以某种方式停止了吗?

【问题讨论】:

  • 请分享 docker 容器日志。 docker logs CONTAINER_NAME
  • 你也可以添加你正在运行的docker命令来启动容器吗?

标签: python-3.x docker flask dockerfile


【解决方案1】:

问题似乎是您没有将 docker 容器的暴露端口映射到本地计算机。要解决此问题,您需要将 run to command 更改为

docker run -it -p 5000:5000 flaskapp.

这告诉 docker 将运行容器中的端口 5000(第一个 5000)映射到本地计算机上的端口 5000(第二个 5000)[例如,如果您想在本地计算机端口 8080 上运行它,而不是标志将是-p 5000:8080]。

当您这样做时,docker ps 的端口部分输出应如下所示:

0.0.0.0:5000->5000/tcp

【讨论】:

  • 谢谢!那成功了。有没有办法在 dockerfile 本身中映射端口?我已经写了 EXPOSE 5000,但正如我所见,这还不够。
  • 不行,只能指定哪些端口可以映射。这就是 EXPOSE 所做的 - 指定容器的哪些端口对主机可用,但没有明确的任何映射。这需要在您运行容器时指定 - 如果这是自动完成的,那么只需执行 docker run 可能会使用主机的许多端口(如果容器使用许多端口),并且可能与其他正在运行的服务发生冲突。 the docs 中的一些有用信息
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多