Docker EXPOSE使用运行时环境变量

时间:2018-05-04 15:07:27

标签: docker dockerfile

我的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 个答案:

答案 0 :(得分:4)

如果您不确定暴露的端口是什么,请不要在dockerfile中设置它们。只需使用--exposedocker run一起在运行时指定端口以及环境变量以获取详细信息:

https://docs.docker.com/engine/reference/run/#expose-incoming-ports

答案 1 :(得分:0)

有点晚了,但是您也可以使用build args并将代码更改为:

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进行构建 在您运行之前。 这样,您可以使容器化的应用程序和容器在相同的端口上运行,而不会变得太复杂。