- 
                Notifications
    You must be signed in to change notification settings 
- Fork 594
Description
The VOLUME instruction should be removed from the image build.
- Containers already persist state internally until the container is destroyed (for example, an image upgraded to a new tag).
- Proper persistence externally should be explicit.
docker-library-redis/debian/Dockerfile
Lines 160 to 162 in 7109557
| RUN mkdir /data && chown redis:redis /data | |
| VOLUME /data | |
| WORKDIR /data | 
Anonymous volumes are created when an image has a VOLUME instruction. They will initialize by copying any of the existing content at the mount point (unlike a bind mount volume which typically replaces content at the mount point):
- With docker run --rm ..., each container instance started will create a new anonymous volume. Without the--rm, these will accumulate pointlessly while the user may not be aware of this implicit waste on their system.
- Docker Compose behaves differently, with additional logic to preserve the same anonymous volume across instances of the container for a given compose project.
The VOLUME instruction provides no value to an image. It only causes problems.
For detailed justification, please see below context for my previous write-up on this subject:
- fix: Dockerfile-VOLUMEdirective is an anti-pattern kanidm/kanidm#2948
- Dockerfile: Remove- VOLUMEinstruction ory/hydra#3683
- Remove VOLUMEinstructions caddyserver/caddy-docker#118 (comment)
- Example of implicit 2GB disk usage per container instance (not applicable to images with empty VOLUMEpublished, but clearly documents aVOLUMEconcern)
Additional context (docker-library specific)
This issue is being raised across docker-library repos (with the only change the Dockerfile referenced snippet to change). It is similar to the past (stale?) docker-library issues for mongo, postgres, mysql, redis.
It is unclear why those older related issues on this topic have remained open for 6-8 years instead of resolving them. If a maintainer could clarify any pragmatic reason to keep VOLUME as a blocker, that would be appreciated. So far the only reason I recall is with Docker Compose, but that seems like a weak argument when persistence actually matters it should be explicit.
If the length (plus varying discussion chains) and age of those issues contribute to the lack of resolution, the issue I raise here hopefully condenses justification for removal into a consistent an easier to digest manner to drive this change forward.
As these are images maintained officially under the docker-library umbrella, it would help endorse VOLUME as an anti-pattern instead of encourage it's usage.