如果我在Dockerfile中使用EXPOSE $ PORT,当我使用`docker run`时,是否可以取消暴露端口?

时间:2015-11-04 23:57:17

标签: docker dockerfile

我正在为一个将使用nginx-proxy容器的网络应用程序的Dockerfile工作。它还有一个用于执行应用程序域内容的CLI(创建/修改数据库,运行清理作业等)。

在99%的情况下,当我启动容器时,我想使用webapp。我在Dockerfile中有一个EXPOSE 3000,它对NGINX-proxy非常有效。 Nginx-proxy使用docker-gen,它会侦听docker的startstop事件,并根据公开的端口重新构建NGINX配置。

当我想运行基于CLI的容器时出现问题。我想要EXPOSE 3000。我想取消暴露端口3000,因此NGINX-proxy不会改变NGINX配置。

这可能来自docker run吗?阅读文档没有给出任何清晰度,尝试docker run -p ''没有做到(我得到docker: No port specified: ::<empty>.错误。)

老实说,这有点挑剔,而且这并不是什么大不了的事。我可以从Dockerfile中取出EXPOSE 3000,然后在命令行上执行-p 3000。我只是喜欢在Dockerfile中使用它,所以它默认打开,我只需要在少数几个实例中关闭它。

我也知道我可以使用继承自第一个的第二个Dockerfile。

我很好奇当我docker run(或者可能是在docker-compose中)时,是否可以取消发布Dockerfile中公开的端口。

2 个答案:

答案 0 :(得分:1)

据我所知,现在不可能。您可以做的最好的事情是使用-P选项将3000映射到某个随机端口,因此它不会与主容器实例冲突,例如。

docker run -it -P <some-image>

这将产生以下docker ps

main_container   0.0.0.0:3000->3000/tcp
run_container    0.0.0.0:32769->3000/tcp

答案 1 :(得分:1)

即使在几年后,情况也没有太大变化。没有UNEXPOSE,但至少有一个解决方法,“docker save”和“docker load”允许编辑泊坞窗图像的元数据。为了删除卷和端口,我创建了一个可以自动完成任务的小脚本,请参阅docker-copyedit