This is a pretty specific problem to my infrastructure, but it may come to bite you, too.
There’s a very simple fix to the problem whereby you run a command like:
docker-compose exec mysql /bin/bash
And you see:
ERROR: No container found for mysql_1
But I’m going to assume you have run docker-compose up -d
already 😉
In my case, this one is a little bit more subtle.
Multiple Docker Compose Projects
In my case, I’ve recently migrated various prod servers from Rancher v1.x to running docker-compose behind Traefik.
One of the early gotchas was that if I have a directory structure like this:
/docker/mysite.com/www/docker-compose.yaml /docker/anothersite.com/www/docker-compose.yaml
And say I go into the mysite.com/www
dir and run docker-compose up
, all is good.
Then I go to the anothersite.com/www
dir and run docker-compose up
, and docker compose would first shut down the mysite.com/www
containers because, by default, docker compose uses the basename
of the directory where your docker-compose.yaml
file lives as the project name.
To put it another way:
basename /docker/mysite.com/www www basename /docker/anothersite.com/www www
So docker-compose
assumes these two different projects are the same thing.
We can pass in a project name when running docker-compose
, like so:
docker-compose up -d...
Of course, make sure your project name differs for each of your projects. And once done, your individual docker-compose
projects should run in the way you would intuitively expect.
But, this creates another problem. The subtle problem I mentioned above.
Once you start docker-compose
projects in this way, all subsequent docker-compose
commands need to the -p my_project_name
flag. Or they will do the (apparently) unintuitive thing.
cd /docker/mysite.com/www docker-compose up -p my_project_name -d Starting my_project_name_nginx … done docker-compose top # ??? - nothing shown docker-compose exec mysql /bin/sh ERROR: No container found for mysql_1 # ??? wtf
This confused me for a good half an hour or so, even leading me to upgrade docker-compose
, try restarting docker, try rebooting the production server… the works.
Of course, none of that worked.
What did work was to include the project name with the command!
docker-compose -p my_project_name top my_project_name_mysql UID PID PPID C STIME TTY TIME CMD 999 9998 9973 0 10:30 ? 00:00:01 mysqld # and docker-compose -p my_project_name exec mysql /bin/bash root@3cb4c8b263ca:/#
Not that this isn’t a bit of a ball ache, but still, at least now it makes sense.