Docker使用运行时环境变量进行EXPOSE

30

我的Dockerfile为环境变量设置了一些默认值,然后暴露了两个端口,这些端口应该是提供的环境变量:

FROM python:3.6.5-stretch

[ ... ]

ENV MY_SERVICE_PORT 8080
ENV MY_SERVICE_PORT_RPC 50051

[ ... ]

EXPOSE ${MY_SERVICE_PORT}
EXPOSE ${MY_SERVICE_PORT_RPC}

当容器启动时,我的应用程序可以正确读取环境变量。如果我使用以下命令运行镜像:

docker run -e "MY_SERVICE_PORT=80" -d -t image_tag

然后我使用 docker ps 命令:

0fb14e12d43d    image_tag    "/bin/sh -c 'python3…"   8080/tcp, 50051/tcp

正如您所看到的,EXPOSE 使用构建时环境变量(默认为 8080 和 50051)。如果我在容器终端中执行 set 命令,我会得到:

MY_SERVICE_PORT=80
MY_SERVICE_PORT_RPC=50051

我该如何确保EXPOSE仅设置为运行时环境变量?这可能吗?

2个回答

30

有点晚了,但您也可以使用构建参数并更改代码:

FROM python:3.6.5-stretch

[ ... ]

ARG MY_SERVICE_PORT=8080
ARG MY_SERVICE_PORT_RPC=50051
# 8080 and 50051 would be the defaults

[ ... ]
# Still functions like environment variables :)
EXPOSE ${MY_SERVICE_PORT}
EXPOSE ${MY_SERVICE_PORT_RPC}

然后,您可以使用docker build --build-arg MY_SERVICE_PORT=80 -t image_tag进行构建,然后再运行。这样您可以拥有容器化的应用程序和使用相同端口运行的容器而不会太复杂。


26

1
有道理。不过,我想在这里使用环境变量,以便 EXPOSE 和内部应用程序具有相同的端口。我想我将不得不使用脚本来运行 docker run 命令,并使用相同的环境变量。 - Momo
2
脚本是一个好主意。通常,如果您使用Docker Compose、Kubernetes等来管理容器,则它们允许配置这些选项,因此您应该没问题。 - Qasim Sarfraz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接