I need to delete a port from the image and for some reason I can’t recreate the image frome base image. How can I remove a port that exposes?
I took this image where a port was exposed
docker 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" ]
2
Answers
There’s no way to cancel an
EXPOSE
directive once it’s been set, whether in the base image or earlier in the same image. FurtherEXPOSE
lines will just expose more ports. (VOLUME
andLABEL
also add values to lists and work the same way.)On the other hand, in modern Docker, "exposing a port" means almost nothing. Ports that are exposed but not published show up in
docker ps
output, and the unusualdocker run -P
option (capitalP
) publishes all exposed ports on arbitrary host ports, but that’s about it.So practically, I’d just ignore this; let your derived container include the base image’s port in
docker ps
even if nothing is actually running there.There are a few options for removing an exposed port:
Ignore it. It’s documentation and doesn’t affect container networking unless you run a specific command that uses this metadata.
Create a new base image without this exposed port. If they are exposing ports that you don’t want exposed in your image, then there may be functionality in the base image you don’t want. If you are changing configuration from the base image, evaluate if that makes more sense to happen in the base image.
Mutate the image after it’s been created. I’m not a huge fan of that for this scenario, but if neither of the above options works, you can save the image from docker and change the json configuration. In my own project, regctl has an image mod command that does this for images in a registry (or you can import an image from docker save to an ocidir):