compose icon indicating copy to clipboard operation
compose copied to clipboard

[BUG] Renew Anon Volumes doesn't work as expected compared to v1

Open ryanneufeld opened this issue 1 year ago • 2 comments

Description

-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving data from the previous containers.

This functions differently than in V1

Steps To Reproduce

With docker-compose v1 it was possible to run docker-compose up -dV and have all the containers restarted with fresh anonymous volumes.

Currently this no longer works expected and up simply updates any containers with new versions fetched via pull

version: "3"
services:
  mysql:
    restart: unless-stopped
    image: mysql:5.7
    ports:
      - "3306:3306"
    expose:
      - "3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

Compose Version

Docker Compose version v2.18.1

Docker Environment

MacOS Ventura 13.4.1 (22F82)

Client:
 Version:    24.0.2
 Context:    desktop-linux
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.5
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.18.1
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-compose
  dev: Docker Dev Environments (Docker Inc.)
    Version:  v0.1.0
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-dev
  extension: Manages Docker extensions (Docker Inc.)
    Version:  v0.2.19
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-extension
  init: Creates Docker-related starter files for your project (Docker Inc.)
    Version:  v0.1.0-beta.4
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-init
  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
    Version:  0.6.0
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-sbom
  scan: Docker Scan (Docker Inc.)
    Version:  v0.26.0
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-scan
  scout: Command line tool for Docker Scout (Docker Inc.)
    Version:  v0.12.0
    Path:     /Users/rneufeld/.docker/cli-plugins/docker-scout

Server:
 Containers: 19
  Running: 1
  Paused: 0
  Stopped: 18
 Images: 17
 Server Version: 24.0.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
 runc version: v1.1.7-0-g860f061
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.15.49-linuxkit-pr
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 5.805GiB
 Name: docker-desktop
 ID: a21ae72f-a439-4ca4-b8f2-4a3afa43de1e
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5555
  127.0.0.0/8
 Live Restore Enabled: false

Anything else?

The example use-case I have is a mysql container that comes up and populates the database with pre-installed SQL. With docker-compose v1, I was able to run docker-compose up -dV and the mysql container would be restarted with a fresh anon volume, and the DB would be imported freshly. With V2 I must down the pool to achieve the same outcome.

ryanneufeld avatar Jul 05 '23 22:07 ryanneufeld

I'm seeing the similar issue

Client: Docker Engine - Community Version: 24.0.5 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.11.2 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.20.2 Path: /home/ev/.docker/cli-plugins/docker-compose scan: Docker Scan (Docker Inc.) Version: v0.23.0 Path: /usr/libexec/docker/cli-plugins/docker-scan

Server: Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 285 Server Version: 24.0.5 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8 runc version: v1.1.7-0-g860f061 init version: de40ad0 Security Options: apparmor seccomp Profile: builtin cgroupns Kernel Version: 6.2.0-27-generic Operating System: Ubuntu 23.04 OSType: linux Architecture: x86_64 CPUs: 16 Total Memory: 15.32GiB Name: katana ID: eb11b5d1-b704-4e65-a495-26c4ac1d77f5 Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false

Docker Compose version v2.20.2

dolzenko avatar Aug 25 '23 10:08 dolzenko

That's indeed not a strict backward compatibility here, but with Docker Compose v2 in the wild for some time I'd prefer we don't change this behavior now

As a simple workaround, you can use --force-recreate to get the desired behavior:

$ docker compose up -d
[+] Running 2/2
 ✔ Network chose_default    Created                                        0.0s 
 ✔ Container chose-mysql-1  Started                                        0.5s 

$ docker inspect chose-mysql-1 --format '{{.Mounts}}'
[{volume 624433dd888107e5259f01ebb29c9ce74166c96604690713ebfd3f203e3369a9 /var/lib/docker/volumes/624433dd888107e5259f01ebb29c9ce74166c96604690713ebfd3f203e3369a9/_data /var/lib/mysql local  true }]

$ docker compose up --force-recreate -d
[+] Running 1/1
 ✔ Container chose-mysql-1  Started                                        0.9s 

 $ docker inspect chose-mysql-1 --format '{{.Mounts}}'
[{volume 624433dd888107e5259f01ebb29c9ce74166c96604690713ebfd3f203e3369a9 /var/lib/docker/volumes/624433dd888107e5259f01ebb29c9ce74166c96604690713ebfd3f203e3369a9/_data /var/lib/mysql local z true }]
# Same volume has been (re)used with recreated container

$  docker compose up --force-recreate -dV
[+] Running 1/1
 ✔ Container chose-mysql-1  Started                                        1.6s 

$ docker inspect chose-mysql-1 --format '{{.Mounts}}'
[{volume 0e49be586b09dbfde54782822bdd529af9b988d012eecbf3944820e7b9291d8b /var/lib/docker/volumes/0e49be586b09dbfde54782822bdd529af9b988d012eecbf3944820e7b9291d8b/_data /var/lib/mysql local  true }]
 # A fresh new volume has been created while re-creating container

ndeloof avatar Nov 30 '23 09:11 ndeloof