在docker中,如何通过dockerfile关闭端口暴露?

In docker,how to close the port expose by dockerfile?

我用一个dockerfile制作了一个图像,在其中我通过"expose 22"一行暴露端口。

"sudo docker build-t mysql_服务器。"

在那之后,我发现我不需要港口。

如何关闭22端口?

编辑:@Adrian Mouat@Seanmcl公司

图像是一个mysql,所以数据库中的数据都在我的容器"cliff_mysql56"中,如果我重新构建图像并运行它,我必须将所有数据从这个容器移动到新的运行者:(。这就是我不想重建的原因。


在这之后的两年多时间里,它仍然没有被发送,你可能已经重建了你的形象一千次。无论如何,我在考虑这个问题,实际上您不能提交和运行新的映像,因为当您再次运行它时,expose指令将被使用。但是,您可以避免从头开始重新构建进行提交,并使用新映像作为新dockerfile的基础。

我不认为这是一个很好的解决方案,但是的,有时你只是需要一个解决方案,即使远不是"最先进的"(而且,我自己也没有尝试过,但我不明白为什么它不起作用)。

基本上,首先将当前图像提交到新图像中:

1
docker commit mysql_server new_mysql_server

然后,使用以前的图像创建一个最小的新dockerfile,如下所示:

1
2
3
4
FROM new_mysql_server
EXPOSE 80 (or just remove EXPOSE)

ENTRYPOINT ["/what/ever"]

然后你建造它

1
docker build -t cmysql_server .

停止/清理图像和以前的容器是可选的,最终您应该有一个没有附加端口的新图像。

尽管你不再需要这个答案,但我希望它对其他人来说是一个有用的建议。

干杯!


dockerfile中的expose行只与链接容器--link相关。如果在运行时不使用-p映射端口,则该端口不会"打开"。如果你真的很喜欢你的照片,就把它放进去,不要担心。(尽管我同意APT图像=牛的类比。)


删除"expose"指令,然后重新生成。

我看到你提到过你不想重建,但是如果你不能在没有数据丢失的情况下快速安全地重建容器,你就没有正确地使用Docker。我会对卷进行研究,以确保所需的数据能够持久保存。


删除Dockerfile中的"expose 22"行,并重建图像