【发布时间】:2020-05-08 14:42:24
【问题描述】:
所以我有一个 docker 文件,我打算构建并推送到 Google Cloud Run,它看起来像这样:
# pull official base image
FROM python:3.7-slim
# set work directory
WORKDIR /usr/src/app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# copy project
COPY . /usr/src/app/
CMD python manage.py runserver 0.0.0.0:$PORT
这个想法是,一旦我将它推送到 Cloud Run,我的 Django 项目将在 0.0.0.0:$PORT 上运行,其中环境变量 $PORT 的值由 Google Cloud Run 自动设置。
我尝试在本地运行以下图像的容器以查看是否可行。我将 $PORT 设置为 80,然后当我运行 docker 映像的容器时,我得到以下信息:
"CommandError: "0.0.0.0:" is not a valid port number or address:port pair."
查看其他答案,例如this。
我了解 0.0.0.0 是给定机器的公共 IP 地址的占位符。我的问题是,为什么我在本地运行docker run [DockerImage] 时没有收到“CommandError”??
如果还有其他问题,请告诉我,我会澄清的。
编辑: 我还想指出我在关注this tutorial
【问题讨论】:
-
$PORT 没有设置在它被扩展的地方。因此,要么它在处理 Dockerfile 时被 docker 扩展(阅读 CMD 的文档),要么 Cloud Run 没有像你说的那样设置它。
-
只是为了仔细检查,您是否在本地计算机上设置了 $PORT 环境变量?在 Cloud Run 上它是自动设置的,但对于本地执行,您必须自己设置。
-
@LundinCast 是的,我已经在本地设置了它,但它不在 Dockerfile 中!
-
你说
0.0.0.0 is a placeholder for the public IP address。这是错误的。 IP 地址0.0.0.0是一种约定,表示侦听所有 IPv4 网络接口。如果系统有多个 IPv4 网络接口,则此约定意味着侦听每个网络接口。请注意,此约定仅适用于创建侦听套接字(等待入站连接尝试)而不适用于出站连接。
标签: python docker google-cloud-platform google-cloud-run