【问题标题】:how to delete a exposed port from a docker image?如何从 docker 镜像中删除暴露的端口?
【发布时间】:2022-11-11 17:57:26
【问题描述】:

我需要从映像中删除一个端口,由于某种原因,我无法从基础映像重新创建映像。如何删除暴露的端口?

我在暴露端口的地方拍摄了这张图片

码头工人ps:

beddbd08c417   new:new   "/bin/sh"   4 seconds ago   Up 2 seconds   9010/tcp   dazzling_pike

Dockerfile:

FROM gitlabregistry.isaco.ir/elyas/oicnode16
ENTRYPOINT [ "/bin/sh" ]

【问题讨论】:

  • 你是什​​么意思你不能重新创建图像?你有错误吗?还有为什么要“删除端口”?

标签: docker dockerfile docker-image


【解决方案1】:

有几个选项可以删除暴露的端口:

  1. 忽略它。它是文档,不会影响容器网络,除非您运行使用此元数据的特定命令。

  2. 创建一个没有此公开端口的新基础映像。如果它们暴露了您不希望在映像中暴露的端口,则基本映像中可能存在您不想要的功能。如果您要从基本映像更改配置,请评估在基本映像中发生这种情况是否更有意义。

  3. 在创建图像后对其进行变异。对于这种情况,我不太喜欢这种情况,但如果上述选项都不起作用,您可以从 docker 保存图像并更改 json 配置。在我自己的项目中,regctl 有一个 image mod 命令,可以对注册表中的图像执行此操作(或者您可以将图像从 docker save 导入到 ocidir):

    $ regctl image copy nginx:latest localhost:5000/library/nginx:latest
    
    $ regctl image config localhost:5000/library/nginx:latest --format '{{jsonPretty .Config.ExposedPorts}}'
    {
      "80/tcp": {}
    }
    
    $ regctl image mod --expose-rm "80/tcp" localhost:5000/library/nginx:latest --create no-expose
    localhost:5000/library/nginx:no-expose
    
    $ regctl image config localhost:5000/library/nginx:no-expose --format '{{jsonPretty .Config.ExposedPorts}}'
    null
    

【讨论】:

  • 谢谢你的回复 danke für Ihre Antwort
【解决方案2】:

一旦设置了EXPOSE 指令,就无法取消它,无论是在基本映像中还是在同一映像的更早版本中。进一步的EXPOSE 行只会暴露更多端口。 (VOLUMELABEL 也将值添加到列表并以相同的方式工作。)

另一方面,在现代 Docker 中,“暴露端口”几乎没有任何意义。公开但未发布的端口显示在docker ps 输出中,不寻常的docker run -P 选项(大写P)在任意主机端口上发布所有公开的端口,仅此而已。

所以实际上,我会忽略这一点;让您的派生容器在docker ps 中包含基本映像的端口,即使那里实际上没有运行任何东西。

【讨论】:

  • 谢谢你的回复 danke für Ihre Antwort
最近更新 更多