write in shared volumes docker

前端 未结 2 1747
忘掉有多难
忘掉有多难 2020-11-28 02:27

I have a docker with a php application on it

I have a share volume, for example

/home/me/dev/site <=> /var/www/site

I can wri

相关标签:
2条回答
  • 2020-11-28 03:22

    (Bind-mounted) volumes in Docker will maintain the permissions that are set on the Docker host itself. You can use this to set the permissions on those files and directories before using them in the container.

    Some background;

    Permissions in Linux are based on user and group ids ('uid' / 'gid'). Even though you see a user- and group name as owner, those names aren't actually important in Linux, they are only there to make it easier for you to see who's the owner of a file (they are looked up from the /etc/passwd file).

    You can set any uid/gid on a file; a user doesn't have to exist when setting those permissions. For example;

    touch foobar && sudo chown 1234:5678 foobar && ls -la foobar
    
    # UID and GID are set to 1234 / 5678, even though there's no such user
    -rw-rw-r-- 1 1234 5678 0 Mar 25 19:14 foobar
    

    Checking permissions (inside and outside a container)

    As mentioned above, Docker maintains ownership of the host when using a volume. This example shows that permissions and ownership in the volume are the same outside and inside a container;

    # (First create a dummy site)
    
    mkdir -p volume-example/site && cd volume-example
    echo "<html><body>hello world</body></html>" > site/index.html
    
    # Permissions on the Docker host;
    
    ls -n site
    
    # total 4
    # -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
    
    # And, permissions inside a nginx container, using it as volume;
    
    sudo docker run --rm -v $(pwd)/site:/var/www nginx ls -n /var/www
    
    # total 4
    # -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
    

    Setting the permissions

    As explained, a user doesn't have to exist in order to use them, so even if we don't have a www-data user on the Docker host, we can still set the correct permissions if we know the "uid" and "gid" of that user inside the container;

    Let's see what the uid and gid of the www-data user is inside the container;

    sudo docker run --rm nginx id www-data
    
    # uid=33(www-data) gid=33(www-data) groups=33(www-data)
    

    First check the state before changing the permissions. This time we run the nginx container as user www-data;

    sudo docker run \
      --rm \
      --volume $(pwd)/site:/var/www \
      --user www-data nginx touch /var/www/can-i-write.txt
    
    # touch: cannot touch `/var/www/can-i-write.txt': Permission denied
    

    Next, set the permissions on the local directory, and see if we are able to write;

    sudo chown -R 33:33 site
    
    sudo docker run \
       --rm \
       --volume $(pwd)/site:/var/www \
       --user www-data nginx touch /var/www/can-i-write.txt
    

    Success!

    0 讨论(0)
  • 2020-11-28 03:23

    Add the following lines to your dockerfile and rebuild your image

    RUN usermod -u 1000 www-data
    RUN usermod -G staff www-data
    
    0 讨论(0)
提交回复
热议问题