docker-compose
version 1.21.0 is not able to handle com.docker.compose.project
labels set with an older version of docker-compose
that contain -
or _
in their container names.
Our deployment does the following:
// pull new images
$ docker-compose pull
// stop old containers
$ docker-compose rm -s -f
// replace docker-compose.yml
// start new containers
$ docker-compose up -d
docker-compose version 1.21.0, build 5920eb0
Docker version 18.03.0-ce, build 0520e24
-
or _
in their container names with docker-compose
version 1.20docker-compose
to version 1.21docker-compose
does not recognize containers deployed with an older version.
It fails to stop already deployed containers and fails to start the new containers afterwards.
docker-compose
recognizes containers deployed with an old version and transparently rewrites existing com.docker.compose.project
labels to the new format.
$ docker-compose rm -s -f
No stopped containers
$ sudo -E docker-compose up -d
Creating container-name ...
Creating container-name ... error
ERROR: for container-name Cannot create container for service container-name: Conflict. The container name "/container-name" is already in use by container "e7dfd157fed12251ed21a70f8243d87baa6fb1e2768e872875c101d37cf99891". You have to remove (or rename) that container to be able to reuse that name.
This issue was introduced with #5844 at https://github.com/docker/compose/blob/9cc30ad0e940453228d6d968e4827cae34eda770/compose/cli/command.py
same issue ... this version of compose changed the rule to build container and volume names prefix ... if the file "docker-compose.yaml" is in a folder with name "a-b" ... previous version of compose used "ab_" as prefix for containr and volume names ... this version use "a-b_" instead
probably related to https://github.com/docker/compose/pull/5788
This problem can also be reproduced if you use docker load
to restore an image and then docker-compose -f docker-compose.yml up -d
to run it. It will try to rebuild the image from the Dockerfile specified in docker-compose.yml
, even though the image already exists thanks to docker load
.
Same issue here. Since I can't wait for fix, did created services docker-compose up --no-start
and then just copy data from previous/old volumes:
docker cp myproject_data_1:/data . && docker cp data my-project-data:/
Is this right that due to new naming scheme docker-compose won't pickup old volumes?
It also affects using options like ipc
for sharing IPC namespaces. This naming change should be reverted.
What's the best work-a-round to handle that until 1.22.0 is out?!?
Downgrade to 1.20.1 seems not to work here :(
Because we can afford a little downtime of our applications we basically stop and remove the currently running container(s) and start our deployment afterwards.
It is not the most elegant solution.
We looked into changing the labels on the running containers but unfortunately you can not do that.
Also... there is no current way to rename volumes:
https://github.com/moby/moby/pull/33966
The 1.21.1 release we pushed out last week will pick up all pre-existing resources, even if they were created with an older version, so that shouldn't be an issue anymore.
@shin- I updated Docker for Mac this morning which included the 1.21.1 release and it ended up wiping out the new volume I had created to account for the change in 1.21.0. I'm guessing others will experience the same. Here's a breakdown of what happened:
There are some steps here that were definitely my fault, but I imagine others may encounter this scenario and it seems like one that could and should be avoided. Before the last step I should have deleted the webapplication_database volume. I thought I had, but I guess not.
Basically it seems that the 1.21.1 update didn't recognize that I had already created the web-application_database volume myself and went ahead and created it again anyway as a copy of webapplication_database.
@ajmueller Hmm, that seems odd ; but first off, Compose doesn't perform any volume copy (there's no way to do that that is driver-agnostic) and doesn't remove volumes unless you explicitly request it (typically with the down
command). So there's a good chance your data's still out there.
You'll want to inspect your containers and check which volume is being mounted, and also check the physical location of each volume to see what data they contain. Chances are things got mixed up if you've got both the legacy and new naming in there, but it should be fixable.
1.21.1 doesn't seem to have resolved this issue for me.
I have to images created that are named wplocalclidocker_wp-dev_1
and wplocalclidocker_mysql_1
which are defined in a folder named wp-local-cli-docker
. When they're stopped and I attempt to restart them via docker-compose up -d
new containers are created named wp-local-cli-docker_..._1
.
C:\Users\felix\git\wp-local-cli-docker>docker-compose version
docker-compose version 1.21.1, build 7641a569
docker-py version: 3.2.1
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2k 26 Jan 2017
C:\Users\felix\git\wp-local-cli-docker>docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:12:48 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:22:38 2018
OS/Arch: linux/amd64
Experimental: true
@shin- This change of behavior deserves a major version bump.
Picture this real-world scenario:
docker-compose up
"docker-compose up --project-name myprojectwithoutdashes
Now some users have volumes with the wrong name. And I have scripts that use raw docker
commands that expect a certain project name. So whom should suffer after I recover from this _undocumented_ change: the users from step 2, or the users from step 3?
My suggestion: mark 1.21 a "bad" release and publish a 1.22 that undoes the change to minimize the damage. Save this (very welcome) change for docker-compose 2.0.
@adamhooper As I said somewhere else, I'm not introducing another breaking change to undo a previous breaking change, as unfortunate as it may have been. I don't see a scenario where that doesn't make things worse for everyone involved.
@felixlinker I'm not sure what the issue is - as far as I can tell, what you're describing is the intended behavior.
I'm pretty sure there are many people still using versions < 1.21. At some point they are going to upgrade and suffer from the breakage, so reverting the breaking change would save them the hassle.
Additionally, since docker volumes cannot be renamed people are scripting around docker and compose, using the well-known docker-compose naming conventions. All these scripts and configurations are being broken.
@shin- Thanks for the clarification. I got this wrong then.
When there is no way to rename containers, is there a way to copy the volumes used by the "broken container" to a newly created container that adheres to the new naming scheme? That should be sufficient in my case but I couldn't find any hints on that.
@cpfeiffer As long as these hypothetical users upgrade to 1.21.1+, there shouldn't be any significant issues.
[...] using the well-known docker-compose naming conventions. All these scripts and configurations are being broken.
Naming conventions should never be treated as a guarantee. People doing so at their own risk will have to adapt their scripts when they upgrade – I believe that is a reasonable expectation. If external scripts depend on volumes being named a certain way, then those names should be explictly declared in the Compose file
@felixlinker Compose will look for the volume using the new naming convention first, then attempt to find it using the legacy naming convention. If you have created both (probably happened if you used 1.21.0) and want to retrieve your previous data, manually removing the volume with the new name and recreating the containers (docker-compose up --force-recreate
) should do the trick.
@shin- Totally agree with that, but conventions shouldn't be broken in a minor release, even without any kind of warning or announcement.
Since you don't intend to revert the change, I'd suggest adding a warning/announcement somewhere, at least.
That happened to me. I was running an older docker-compose version that didn't have hyphens. I have some services that were created and started before hyphens in names were a thing.
Now docker-compose ps
etc do not work with those services anymore because it's looking for my-project_service_#
names instead of the existing myproject_service_#
.
And new projects are broken too. If I start a new project that didn't exist before updating to 1.21.2 with docker-compose up
, it will still name without hyphens, and every docker-compose command is broken.
This happens with 1.21.2
For anyone with this issue, the only solution is to go back to 1.20.1 (the last version before the breaking change):
$ which docker-compose # to see where it's installed
$ sudo rm $(which docker-compose)
$ sudo curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose # or wherever your previous docker-compose was
$ sudo chmod +x /usr/local/bin/docker-compose # or wherever you put it
$ sudo docker-compose --version
docker-compose version 1.20.1, build 5d8c71b
@coaxial #5982
@shin- Thanks, I'll stick to 1.20.1 in the meantime. Any ETA for 1.22.0?
Is this fixed in 1.24.1, build 4667896b ??
Most helpful comment
@shin- Totally agree with that, but conventions shouldn't be broken in a minor release, even without any kind of warning or announcement.
Since you don't intend to revert the change, I'd suggest adding a warning/announcement somewhere, at least.