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:
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
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.