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

JT.*_*JT. 5 docker dockerfile

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

在99%的情况下,启动容器时,我想使用webapp。我EXPOSE 3000在Dockerfile中有一个,对于NGINX-proxy来说效果很好。Nginx的代理用途泊坞窗根,它侦听码头工人start和stop事件和NGINX配置基础上暴露的端口重新建立。

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

这是可能的docker run吗?阅读文档并不清楚,尝试docker run -p ''也没有用(我得到了一个docker: No port specified: ::<empty>.错误)。

老实说,这有点无聊,没什么大不了的。我可以带EXPOSE 3000出Dockerfile的,只是做-p 3000在命令行上。我只是喜欢将其包含在Dockerfile中,因此默认情况下它是打开的,我只需要在少数情况下将其关闭即可。

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

我只是想知道是否可以在发布时取消发布在Dockerfile中公开的端口docker run(或者可能在docker -compose中)。

Gui*_*eim 6

即使几年过去了,情况也没有太大改变。没有 UNEXPOSE,但至少有一个解决方法,可以使用“ docker save”和“ docker load”来编辑 docker 镜像的元数据。至少为了删除卷和端口,我创建了一个可以自动执行任务的小脚本,请参阅docker-copyedit。


Dmi*_*nko 2

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

docker run -it -P <some-image>
Run Code Online (Sandbox Code Playgroud)

这将导致以下结果docker ps

main_container   0.0.0.0:3000->3000/tcp
run_container    0.0.0.0:32769->3000/tcp
Run Code Online (Sandbox Code Playgroud)