我正在为一个将使用nginx-proxy容器的网络应用程序的Dockerfile工作。它还有一个用于执行应用程序域内容的CLI(创建/修改数据库,运行清理作业等)。
在99%的情况下,当我启动容器时,我想使用webapp。我在Dockerfile中有一个EXPOSE 3000
,它对NGINX-proxy非常有效。 Nginx-proxy使用docker-gen,它会侦听docker的start
和stop
事件,并根据公开的端口重新构建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中公开的端口。
答案 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。