I am aware of two ways of creating Docker images:
- Build the image using a Dockerfile
- Use
docker commit <container_id>
against a running container with changes.
I find changing a Dockerfile each time I need image changes to be awfully inconvenient.Instead I have taken to launching ephemeral containers with docker run
, installing packages I need on the fly with sudo, then committing the image.
I didn't realize however there is a footgun involved in this approach, especially if you frequently use and switch up docker run
hacks. I launch containers with changing bind mounts, environment variables, differing networks, etc. A lot of that seems to be considered part of the configuration of the container, and is committed in docker commit
alongside actual filesystem changes.
For example if you do:
docker run --env FOO=BAR --name container_name ubuntu:focaldocker commit container_name new_imagedocker run -it new_imageecho $FOO
You will see that the env variable FOO is now a part of new_image.
This creates some awfully confusing situations, as I consider arguments to docker run
to be as ephemeral as the container it creates. I am only concerned about persisting package installs.
I would like to commit just the actual image, just the filesystem changes.Is there any way to do that?