python-3.x - 在 Dockerfile 上设置环境变量,烧瓶服务器不起作用
问题描述
我需要在我的 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
这是码头工人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 run -it -p 5000:5000 flaskapp
.
这告诉 docker 将正在运行的容器(第一个 5000)中的端口 5000 映射到本地计算机上的端口 5000(第二个 5000)[例如,如果您想在本地计算机端口 8080 上运行它,那么标志将是-p 5000:8080
]。
当你这样做时,端口部分的输出docker ps
应该类似于:
0.0.0.0:5000->5000/tcp
推荐阅读
- r - 如何从使用 R 从网站下载的文件中检索特定信息
- prisma - 使用 MongoDB 的 Prisma 中缺少逻辑或
- python - 如何将 URI 转换为字典
- javascript - 无法修改锚元素的 innerHTML
- raspberry-pi - 通过 RTSP 流式传输 H264 时视频帧损坏
- vuejs2 - “Computed”中的 V-For 不显示
- google-cloud-data-fusion - 在 Cloud Data Fusion 中对 BigQuery 执行 MSSQL 时如何修复“java.lang.NullPointerException:null”
- php - 如何从字符串中获取数据
- javascript - 如何解决 Uncaught TypeError: Cannot read property 'length' of undefined of my Global 变量?
- java - 八个随机整数的数组,其中每个整数与数组中所有其他整数的差异至少为 15?