nowox
nowox

Reputation: 29086

Simple method to run docker or docker-compose with the same UID/GID as parent user?

When I use docker or docker-compose with volumes I often have issues with permissions as the container user is not known on the host:

mkdir i-can-to-what-i-want
rmdir i-can-to-what-i-want
docker run -v$(pwd):/home -w/home ubuntu touch you-shall-not-delete-it
$ ls -al you-shall-not-delete-it
-rw-r--r--  2 root   root   0 2020-08-08 00:11 you-shall-not-delete-it

One solution is to always do this:

UID=$(id -u) GID=$(id -g) docker-compose up

Or

UID=$(id -u) GID=$(id -g) docker run ...

But... it is cumbersome...

Any other method?

Upvotes: 2

Views: 3144

Answers (2)

davidxxx
davidxxx

Reputation: 131316

In fact you don't use volume here :

docker run -v$(pwd):/home 

you use bind mound.
When you use a bind mount, the resource on the host machine is mounted into a container.
Relying on the host machine’s filesystem has advantages (speed and a dynamic data source) but has also its limitations (file ownership and portability).

How I see things :

1)When you use docker-compose in dev and that you need to bind your source code that constantly changes, bind mount is unavoidable but you can simplify things by setting the user/group of the container directly in the compose.

version: '3.5'
services:
   app:
     user: "${UID}:${GID}"
     ...

Note that ${UID} and ${GID} are here shell variables.
${UID} is defined in bash, but ${GID} is not. You could export it if required or so use the user id for both : user: "${UID}:${UID}".

2)When you use docker or docker-compose in a frame where you don't need to provide the files/folders from that host at container creation time but that you can do it in the image creation, favor volume (name volume) over bind mount.

Upvotes: 1

Neo Anderson
Neo Anderson

Reputation: 6350

--user will do the job, unless this is the exact cumbersome solution that you are trying to avoid:

who
neo      tty7         2020-08-08 04:46 (:0)

docker run --user $UID:$GID -v$(pwd):/home -w/home ubuntu touch you-shall-delete-it

ls -la
total 12
drwxr-xr-x  3 neo neo 4096 Aug  8 02:12 .
drwxr-xr-x 34 neo neo 4096 Aug  8 02:03 ..
drwxr-xr-x  2 neo neo 4096 Aug  8 02:03 i-can-to-what-i-want
-rw-r--r--  1 neo neo    0 Aug  8 02:12 you-shall-delete-it

Upvotes: 3

Related Questions