Docker 默认是以root方式运行,并且镜像内部的默认用户也为root,所以在容器创建文件后,权限为root,退出容器发现文件夹等权限为root,本地宿主机不能够正常访问,下面是一些解决方法(推荐第一和第四种)。

前期准备,在主机上获得当前用户的uid和gid,使用以下命令:
id -u
id -g

  1. 退出容器前将文件夹权限更改为宿主机用户的权限:
    chown -R uid:gid /path/to uid 和 gid即你获取的值,/path/to 需要修改的路径

  2. 以当前的用户开启容器
    例如ubuntu:
    docker run -it -v path:path --user "$(id -u):$(id -g)" ubuntu /bin/bash
    这样容器里的用户的uid和gid和宿主机保持一致,就没有问题了

  3. 构建镜像
    虽然2可以解决权限问题,但是容器里默认是没有该用户的,并且也不能正常进入root用户,所以可以在构建image之前加入用户:

    1
    2
    3
    4
    5
    6
    FROM ubuntu
    ARG USER_ID
    ARG GROUP_ID
    RUN addgroup --gid $GROUP_ID user
    RUN adduser --disabled-password --gecos ' ' --uid $USER_ID --gid $GROUP_ID user
    USER user

    这样image就有了当前用户的信息,然后以root进入镜像,切换为你的默认用户,这样root和你本身id都可以正常使用了。

  4. 进入容器并增加用户
    如果每个人都创建image会造成资源浪费,所以可以将3的步骤在进入容器的第一时间来完成就行了,例如你还是以之前的方式开启了ubuntu镜像,进入之后是root用户,也正确挂载了路径。
    此时执行下面的命令增加用户组

    1
    addgroup --gid gid user

    gid为你刚刚获取的giduser为你宿主机组名(也可以随便取,只要gid正确),然后执行下面的命令增加用户

    1
    adduser --disabled-password --gecos ' ' --uid uid --gid gid user`

    gid为你刚刚获取的giduid为你刚刚获取的uiduser为你宿主机用户名(也可以随便取,只要uid正确)

    –gecos :Set the gecos field for the new entry generated. adduser will not ask for finger information if this option is given.
    –disabled-password:Like –disabled-login, but logins are still possible (for example using SSH RSA keys) but not using password authentication.