Docker 错误 - CommandError:“0.0.0.0:”不是有效的端口号或地址:端口对

Posted

技术标签:

【中文标题】Docker 错误 - CommandError:“0.0.0.0:”不是有效的端口号或地址:端口对【英文标题】:Docker Error - CommandError: "0.0.0.0:" is not a valid port number or address:port pair 【发布时间】: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 网络接口,则此约定意味着侦听每个网络接口。请注意,此约定仅适用于创建侦听套接字(等待入站连接尝试)而不适用于出站连接。 【参考方案1】:

在宿主机上设置环境变量不会在容器内设置。

命令python manage.py runserver 0.0.0.0:$PORT 在未设置$PORT 的容器内运行,因此扩展为python manage.py runserver 0.0.0.0:

尝试docker run -e PORT=$PORT <your_image> 将容器内的PORT 环境变量设置为来自主机的值。

【讨论】:

【参考方案2】:

您没有在 Dockerfile 中设置 PORT 环境变量,这就是它在 CMD 执行期间无法解析 $PORT 的原因。

您可以按如下方式更新您的 Dockerfile(我以 8080 为例,将其更新为所需的端口):

# 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
ENV PORT 8080

# 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

希望对你有帮助

【讨论】:

您好,感谢您的回复,我会选择此作为最佳答案,但上面的人已经工作了。不过谢谢 - 我认为这对未来的人们来说是一个很好的参考。

以上是关于Docker 错误 - CommandError:“0.0.0.0:”不是有效的端口号或地址:端口对的主要内容,如果未能解决你的问题,请参考以下文章

CommandError:找不到xgettext。 Django的

CommandError:您似乎没有安装“psql”程序或在您的路径上

CommandError:一个或多个模型未验证

无法运行镜像,CMD ["npm", "start"] 命令错误

Redis常见报错之 Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it is current

为啥cmd powershell -command中的最后一行错误