Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to give non-root user in Docker container access to a volume mounted on the host

I am running my application in a Docker container as a non-root user. I did this since it is one of the best practices. However, while running the container I mount a host volume to it -v /some/folder:/some/folder . I am doing this because my application running inside the docker container needs to write files to the mounted host folder. But since I am running my application as a non-root user, it doesn't have permission to write to that folder

Question

Is it possible to give a nonroot user in a docker container access to the hosted volume?

If not, is my only option to run the process in docker container as root?

like image 672
Anthony Avatar asked Sep 08 '16 18:09

Anthony


People also ask

Can you mount a docker volume on the host?

You can mount host volumes by using the -v flag and specifying the name of the host directory. Everything within the host directory is then available in the container. What's more, all the data generated inside the container and placed in the data volume is safely stored on the host directory.


2 Answers

There's no magic solution here: permissions inside docker are managed the same as permissions without docker. You need to run the appropriate chown and chmod commands to change the permissions of the directory.

One solution is to have your container run as root and use an ENTRYPOINT script to make the appropriate permission changes, and then your CMD as an unprivileged user. For example, put the following in entrypoint.sh:

#!/bin/sh  chown -R appuser:appgroup /path/to/volume exec runuser -u appuser "$@" 

This assumes you have the runuser command available. You can accomplish pretty much the same thing using sudo instead.

Use the above script by including an ENTRYPOINT directive in your Dockerfile:

FROM baseimage  COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/bin/sh", "entrypoint.sh"] CMD ["/usr/bin/myapp"] 

This will start the container with:

/bin/sh entrypoint.sh /usr/bin/myapp 

The entrypoint script will make the required permissions changes, then run /usr/bin/myapp as appuser.

like image 168
larsks Avatar answered Oct 01 '22 21:10

larsks


There will throw error if host env don't have appuser or appgroup, so better to use a User ID instead of user name:

inside your container, run

appuser$ id 

This will show:

uid=1000(appuser) gid=1000(appuser) groups=1000(appuser)

From host env, run:

mkdir -p /some/folder chown -R 1000:1000 /some/folder docker run -v /some/folder:/some/folder [your_container] 

inside your container, check

ls -lh 

to see the user and group name, if it's not root, then it's should worked.

like image 20
James Yang Avatar answered Oct 01 '22 20:10

James Yang