Why docker-compose creates directories/files with user:group 999:999?
Docker creates and populates the directory with the user that mysql
image uses. That user, of course, has an uid
within the container. That uid
happens to be 999.
The user with that uid
exists in the container but does not exist in your host.
On the container the folder looks like this:
root@f86ffddac96c:/var/lib# ls -l
total 32
...
drwxr-xr-x 5 mysql mysql 4096 Mar 19 13:06 mysql
...
and on the host it ends up looking like this.
root@machine:/home/username/mysql/var/lib# ls -l
total 4
drwxr-xr-x 5 999 docker 4096 Mar 19 15:06 mysql
This just simply means that the user mysql
has uid
of 999. And as you are creating a bind volume from container to host, all files within that volume must have same permissions for same uid
s. On my test machine docker has guid
of 999, which is why it is displayed as such on the host side.
As for "fixing" this you can either use a (host-level) known uid
in the dockerfile instead of the default one, or you can just ignore it, as it is working exactly as intended, unless there's a specific reason why you want it to display a certain name for a certain uid
in your host system.
Our Dockerfile has lines like
ARG uid=1000
ARG gid=1000
RUN groupadd -g $gid myuser && useradd -lm -u $uid -g $gid myuser
USER myuser
Then we build with
docker-compose build --build-arg uid=`id -u` --build-arg gid=`id -g` mydocker
So that the uid and gid of the user created inside the Docker is the same as the uid and gid of the user running docker-compose outside the Docker.