【问题标题】:Docker - mount directory's owner and groupDocker - 挂载目录的所有者和组
【发布时间】:2020-01-27 11:03:47
【问题描述】:

我运行了一个将主机目录绑定到容器目录的 docker 容器,但容器目录及其文件的权限因主机而异。

docker run -w /vlc-android -v $(pwd)/vlc-android:/vlc-android --rm vlc-android:latest bash -c "ls -ld /vlc-android"

Mac OS 10.14.6(Docker 桌面版本 2.1.0.3)上的结果

drwxr-xr-x 2 videolan videolan 64 Sep 27 04:34 /vlc-android

Ubuntu 服务器 18.04.3 上的结果

drwxr-xr-x 2 root 根 4096 Sep 27 06:11 /vlc-android

我正在尝试构建 VLC 播放器 Android 应用。从source code 通过docker image of the vlc-android build environment 或以下...

FROM debian:stretch-20190506

MAINTAINER VideoLAN roots <roots@videolan.org>

ENV IMAGE_DATE=201907171600

ENV ANDROID_NDK="/sdk/android-ndk" \
    ANDROID_SDK="/sdk/android-sdk-linux"

# If someone wants to use VideoLAN docker images on a local machine and does
# not want to be disturbed by the videolan user, we should not take an uid/gid
# in the user range of main distributions, which means:
# - Debian based: <1000
# - RPM based: <500 (CentOS, RedHat, etc.)
ARG VIDEOLAN_CI_UID=499

RUN addgroup --quiet --gid ${VIDEOLAN_CI_UID} videolan && \
    adduser --quiet --uid ${VIDEOLAN_CI_UID} --ingroup videolan videolan && \
    echo "videolan:videolan" | chpasswd && \
    apt-get update && \
    apt-get install --no-install-suggests --no-install-recommends -y \
    openjdk-8-jdk-headless ca-certificates autoconf m4 automake ant autopoint bison \
    flex build-essential libtool libtool-bin patch pkg-config ragel subversion \
    git rpm2cpio libwebkitgtk-1.0-0 yasm ragel g++ protobuf-compiler gettext \
    libgsm1-dev wget expect unzip python python3 locales libltdl-dev curl && \
    echo "deb http://ftp.debian.org/debian stretch-backports main" > /etc/apt/sources.list.d/stretch-backports.list && \
    apt-get update && apt-get -y -t stretch-backports install cmake && \
    rm -f /etc/apt/sources.list.d/stretch-backports.list && \
    echo "deb http://deb.debian.org/debian testing main" > /etc/apt/sources.list.d/testing.list && \
    apt-get update && apt-get -y -t testing --no-install-suggests --no-install-recommends install automake && \
    rm -f /etc/apt/sources.list.d/testing.list && \
    apt-get clean -y && rm -rf /var/lib/apt/lists/* && \
    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 && \
    echo "export ANDROID_NDK=${ANDROID_NDK}" >> /etc/profile.d/vlc_env.sh && \
    echo "export ANDROID_SDK=${ANDROID_SDK}" >> /etc/profile.d/vlc_env.sh && \
    mkdir sdk && cd sdk && \
    wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip && \
    ANDROID_NDK_SHA256=4f61cbe4bbf6406aa5ef2ae871def78010eed6271af72de83f8bd0b07a9fd3fd && \
    echo $ANDROID_NDK_SHA256 android-ndk-r18b-linux-x86_64.zip | sha256sum -c && \
    unzip android-ndk-r18b-linux-x86_64.zip && \
    rm -f android-ndk-r18b-linux-x86_64.zip && \
    ln -s android-ndk-r18b android-ndk && \
    mkdir android-sdk-linux && \
    cd android-sdk-linux && \
    mkdir "licenses" && \
    echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > "licenses/android-sdk-license" && \
    echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> "licenses/android-sdk-license" && \
    wget -q https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip && \
    SDK_TOOLS_SHA256=444e22ce8ca0f67353bda4b85175ed3731cae3ffa695ca18119cbacef1c1bea0 && \
    echo $SDK_TOOLS_SHA256 sdk-tools-linux-3859397.zip | sha256sum -c && \
    unzip sdk-tools-linux-3859397.zip && \
    rm -f sdk-tools-linux-3859397.zip && \
    tools/bin/sdkmanager "build-tools;26.0.1" "platform-tools" "platforms;android-26" && \
    chown -R videolan /sdk

ENV LANG en_US.UTF-8
USER videolan

RUN git config --global user.name "VLC Android" && \
    git config --global user.email buildbot@videolan.org

并像下面这样构建它

docker build -t vlc-android .

我希望用户 ID“videolan”是容器目录“/vlc-android”的所有者 ID,并且容器中的所有文件在 Ubuntu 服务器 18.04.3 上运行,如“Mac OS 10.14.6 上的结果” (Docker 桌面版 2.1.0.3)"。

我该怎么办?

【问题讨论】:

    标签: docker permissions vlc docker-volume vlc-android


    【解决方案1】:

    当您在 linux 上挂载卷时,docker 容器中生成的文件夹将获得与主机上的文件夹相同的权限。如果主机上的文件夹由 root 拥有,那么它也将由 docker 容器内的 root 拥有。

    要解决您的问题,您必须更改 $(pwd)/vlc-android 的所有者以匹配容器中使用的用户 ID(根据您在问题中附加的 Dockerfile,UID 为 499)。

    尝试执行这个:

    sudo chown 499 -R $(pwd)/vlc-android
    

    然后重启容器。


    编辑:

    另一个解决方案是,如果您能够在 ubuntu 服务器上重建 docker 映像,则重新生成映像以使用文件夹所有者 ID 而不是 499。

    您只需获取文件夹所有者 ID(尽量避免使用 root 用户):

    id $username
    

    并使用以下命令重新生成 docker 映像:

    USER_ID=1000
    docker build \
        -t my_new_vlc_androing_thingy \
        --build-arg VIDEOLAN_CI_UID=${USER_ID} \
        .
    

    然后运行它:

    docker run --rm \
        -w /vlc-android \
        -v $(pwd)/vlc-android:/vlc-android \
        my_new_vlc_androing_thingy \
        bash -c "ls -ld /vlc-android"
    

    【讨论】:

    • 谢谢!这么好的解决方法!但仍然......当我在我的 Ubuntu 上使用 --mount 运行它时,容器中的文件夹获得与您告诉我的主机相同的权限。但是使用-v,生成的文件夹所有者是“root”,主机不属于root。
    • chown 必须在主机上执行,而不是在容器上。在这种情况下 --mount 和 --volume 的行为没有什么不同。在这两种情况下,他们都从主机获得文件夹/文件所有权
    • 添加了另一个可能的解决方案
    • 好主意!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多