已安装的 Docker 卷中的权限被拒绝

已安装的 Docker 卷中的权限被拒绝

我已经使用 Docker 有一段时间了,并且总是遇到挂载卷的权限问题。

事实上,当我使用 docker-compose 在 Docker 容器中运行我的镜像时,我的卷会从容器中继承所有者root:root,因此我无法编辑或将我的卷复制到其他位置。

有人能告诉我是否有任何 docker 方法可以解决这个问题吗?

答案1

  • 您可以放一个docker-compose 文件中的用户指令(同上docker run --user someuser ...)让容器进程假定现有主机用户的 id/group。

  • 您还可以设置umask在容器中使创建的文件组或世界可读/可写(无论您是否以 root 身份运行,但最好不要以 root 身份运行)。

  • 您可以考虑构建镜像以使用不同的 USER 运行(即,在您的 Dockerfile 中添加 USER 语句)。此用户的名称并不重要,但您通常会使数字 ID 与主机上的 ID 匹配,以便容器进程创建的所有文件都归该 ID 所有。在主机端,它们将显示为具有相同数字 ID 的用户 ID 所有。如果您想要更花哨,您可以对组执行相同操作。

答案2

对于特殊情况,如果你想在生产/开发之间共享基础镜像,而又不想在每台机器上使用新的开发者用户 ID/GID 重建它,请参阅文章以当前主机用户身份运行 Docker 容器 - Juan Treminio总结一下,在新的 Dockerfile 中重新创建你的内部 docker 用户:

FROM jtreminio/php:7.2

ARG USER_ID
ARG GROUP_ID

RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \
    userdel -f www-data &&\
    if getent group www-data ; then groupdel www-data; fi &&\
    groupadd -g ${GROUP_ID} www-data &&\
    useradd -l -u ${USER_ID} -g www-data www-data &&\
    install -d -m 0755 -o www-data -g www-data /home/www-data &&\
    chown --changes --silent --no-dereference --recursive \
          --from=33:33 ${USER_ID}:${GROUP_ID} \
        /home/www-data \
        /.composer \
        /var/run/php-fpm \
        /var/lib/php/sessions \
;fi
        
USER www-data

对于更特殊的情况,如果您将任何内部 docker 用户的文件创建限制在主目录中,您可以让其为您usermod执行操作。从手册页中:chownusermod

-u, --uid UID

用户ID的新数值。

...

用户的邮箱以及用户拥有的任何位于用户主目录中的文件的文件用户 ID 都会自动更改。

必须手动修复用户主目录之外的文件的所有权。

Juan 的解决方案可以简化为:

USER root
ARG HOST_ID="1000"
ARG HOST_GID="1000"
RUN if [ $HOST_ID -ne $USER_ID ] || [ $HOST_GID -ne $USER_GID ]; then \
    groupadd --gid "$HOST_GID" "host_user_group" &&\
    usermod --uid "$HOST_ID" --gid "$HOST_GID" "$UNAME"\
;fi
USER $UNAME

相关内容