Skip to content

Remove usage of the VOLUME instruction #1319

Closed
@polarathene

Description

@polarathene

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.

ENV PGDATA /var/lib/postgresql/data
# this 1777 will be replaced by 0700 at runtime (allows semi-arbitrary "--user" values)
RUN install --verbose --directory --owner postgres --group postgres --mode 1777 "$PGDATA"
VOLUME /var/lib/postgresql/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:


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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions