如果我在Dockerfile中使用EXPOSE $ PORT,那么当我使用`docker run`的时候,我可以不使用这个端口吗?

我正在为将使用nginx代理容器的Web应用程序的Dockerfile工作。 它也有一个CLI做域名的东西(创build/修改数据库,运行清理工作等)

在99%的情况下,当我启动一个容器时,我想使用webapp。 我在EXPOSE 3000中有一个EXPOSE 3000 ,对NGINX代理来说非常好。 Nginx代理使用docker-gen ,它监听docker的startstop事件,并根据暴露的端口重新构buildNGINXconfiguration。

问题出现在我想运行一个基于CLI的容器时。 我想要EXPOSE 3000 。 我想解开端口3000,所以NGINX-proxy不会改变NGINXconfiguration。

docker run可能吗? 阅读文档没有给出任何澄清,并试图docker run -p ''没有工作(我有一个docker: No port specified: ::<empty>.错误)。

老实说,这有点挑剔,这不是什么大不了的事情。 我可以EXPOSE 3000EXPOSE 3000取出,并在命令行上执行-p 3000 。 我只是喜欢它在Dockerfile中,所以它默认情况下,我只需要在less数情况下closures它,当我需要它。

我也知道,我可以使用从第一个inheritance的第二个Dockerfile。

我只是好奇,如果有可能取消发布端口文件中暴露的端口,当我做docker run (或可能在docker-compose)。

据我所知,现在是不可能的。 你可以做的最好的事情是使用-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