2

I cannot find anywhere answer why docker changes owner of files mounted as volume. Before docker run:

$ ls -la
total 56
drwxrwxr-x 9 ci ci 4096 Mar 13 21:13 .
drwxrwxr-x 4 ci ci 4096 Mar 13 21:12 ..
-rw-rw-r-- 1 ci ci 1108 Mar 13 21:13 application.yml
drwxrwxr-x 5 ci ci 4096 Mar 13 21:13 ci
drwxrwxr-x 5 ci ci 4096 Mar 13 21:13 config
drwxrwxr-x 3 ci ci 4096 Mar 13 21:13 database
-rw-rw-r-- 1 ci ci 2779 Mar 13 21:13 Dockerfile
drwxrwxr-x 3 ci ci 4096 Mar 13 21:13 docker-stuff
drwxrwxr-x 8 ci ci 4096 Mar 13 21:13 .git
-rw-rw-r-- 1 ci ci  137 Mar 13 21:13 .gitignore
-rwxrwxr-x 1 ci ci 6366 Mar 13 21:13 image.sh

After docker run:

$ ls -la
total 60
drwxrwxr-x 10 administrator administrator 4096 Mar 13 21:15 .
drwxrwxr-x  4 ci            ci            4096 Mar 13 21:12 ..
-rw-rw-r--  1 administrator administrator 1108 Mar 13 21:13 application.yml
drwxrwxr-x  5 administrator administrator 4096 Mar 13 21:13 ci
drwxrwxr-x  5 ci            ci            4096 Mar 13 21:13 config
drwxrwxr-x  3 administrator administrator 4096 Mar 13 21:13 database
-rw-rw-r--  1 administrator administrator 2779 Mar 13 21:13 Dockerfile
drwxrwxr-x  3 administrator administrator 4096 Mar 13 21:13 docker-stuff
drwxrwxr-x  8 administrator administrator 4096 Mar 13 21:13 .git
-rw-rw-r--  1 administrator administrator  137 Mar 13 21:13 .gitignore
-rwxrwxr-x  1 administrator administrator 6366 Mar 13 21:13 image.sh

Full docker run command is:

docker run -d \
             --rm \
             --name "$CONTAINER_NAME" \
             -p "$SHINY_HOST_PORT:3838" \
             -p "$RSTUDIO_HOST_PORT:8787" \
             -v "$DATA_DIR_ON_HOST":"$DATA_DIR_IN_CONTAINER" \
             -v "$CONFIG_DIR_ON_HOST":"$CONFIG_DIR_IN_CONTAINER" \
             -v $(pwd):"/data/" \
             "$DOCKER_IMAGE":"$DOCKER_TAG"

My user groups are:

$ groups
ci sudo docker administrator

Do you have any ideas why does it happen?

Taz
  • 5,755
  • 6
  • 26
  • 63

2 Answers2

1

Try the following command which adds the --user docker run option to control the uid and gid that will be used by the process running in your container:

docker run -d \
      --rm \
      --name "$CONTAINER_NAME" \
      -p "$SHINY_HOST_PORT:3838" \
      -p "$RSTUDIO_HOST_PORT:8787" \
      -v "$DATA_DIR_ON_HOST":"$DATA_DIR_IN_CONTAINER" \
      -v "$CONFIG_DIR_ON_HOST":"$CONFIG_DIR_IN_CONTAINER" \
      -v $(pwd):"/data/" \
      --user "$(id -u ci):$(getent group ci | cut -d: -f3)" \
      "$DOCKER_IMAGE":"$DOCKER_TAG"

  • id -u ci will get the uid of user ci
  • getent group ci | cut -d: -f3 will get the gid of group ci
Thomasleveil
  • 95,867
  • 15
  • 119
  • 113
0

The permission in the container run as root by default, so every time you mount a volume the permissions are reset to root. Refer this article.

bot
  • 1,293
  • 3
  • 17
  • 34