本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

将非根用户添加到容器中

许多Docker镜像默认使用root用户,但在某些情况下,您可能更喜欢使用非root用户。如果您这样做,有一些关于本地文件系统(挂载)的怪癖需要注意。具体来说:

  • Docker Desktop for Mac:在容器内,任何挂载的文件/文件夹将被视为由您指定的容器用户拥有。在本地,所有文件系统操作将使用您的本地用户权限。

  • Docker Windows桌面版:在容器内,任何挂载的文件/文件夹将显示为由但是您指定的用户仍然可以读/写它们,并且所有文件将是可执行的。在本地,所有文件系统操作将使用您本地用户的权限。这是因为从根本上无法直接将Windows风格的文件权限映射到Linux。

  • Docker CE/EE on Linux:在容器内部,任何挂载的文件/文件夹将具有与容器外部相同的权限,包括所有者用户ID(UID)和组ID(GID)。由于这一点,您的容器用户需要具有相同的UID或属于具有相同GID的组。用户名/组名的实际名称并不重要。机器上的第一个用户通常具有1000的UID,因此大多数容器将此用作用户ID以避免此问题。

指定 VS Code 的用户

如果你使用的镜像或Dockerfile已经提供了一个可选的非根用户(比如节点图像) 但仍然默认为根目录,您可以选择让Visual Studio Code (服务器)和任何子进程(终端、任务、调试)使用它,通过指定远程用户物业在devcontainer.json输入:

"远程用户": "用户名替换这里"

在 Linux 上,如果你在引用一个Dockerfile、镜像或 Docker Composedevcontainer.json这也将自动将容器用户的 UID/GID 更新为匹配您的本地用户,以避免在这种环境中存在的挂载权限问题(除非您设置"更新远程用户UID": false)。

由于此设置仅影响 VS Code 和相关子进程,因此需要重启 VS Code(或重新加载Windows)才能生效。但是,UID/GID 更新仅在容器创建时应用,需要重建才能更改。

指定默认容器用户

在某些情况下,您可能需要将容器中的所有进程以不同的用户(例如,由于启动要求)运行,而不仅仅是 VS Code。这在您是否使用 Docker Compose 时略有不同。

  • Dockerfile 和镜像:添加 容器用户属性到此文件。

    "容器用户": "用户名替换这里"
    

    在 Linux 上,像远程用户这也将自动将容器用户的 UID/GID 更新为匹配您的本地用户,以避免在这种环境中存在的挂载权限问题(除非您设置"更新远程用户UID": false)。

  • Docker Compose:更新(或 扩展)你的 docker-compose.yml与以下内容的服务:

    用户用户名或用户ID在此处
    

创建非根用户

任何来自 Dev Containers 扩展的图像或 Dockerfile 都将包含一个 UID/GID 为 1000 的非根用户(通常命名为Visual Studio Code节点),许多基础镜像和Dockerfile并不这样做。幸运的是,你可以更新或创建一个Dockerfile,将非根用户添加到你的容器中。

即使在生产环境中,也建议以非根用户运行您的应用程序(因为它更安全),因此即使您在重用现有的Dockerfile,这也是一个好主意。例如,这个用于Debian/Ubuntu容器的片段将创建一个名为用户名称填写此处赋予它使用的能力超级用户权限,将其设置为默认:

ARG USERNAME=用户名-这里是占位符
ARG USER_UID=1000
ARG USER_GID=$USER_UID

# Create the user
RUN groupadd --gid $USER_GID $USERNAME \
    && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
    #
    # [Optional] Add sudo support. Omit if you don't need to install software after connecting.
    && apt-get update \
    && apt-get install -y sudo \
    && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
    && chmod 0440 /etc/sudoers.d/$USERNAME

# ********************************************************
# * Anything else you want to do like clean up goes here *
# ********************************************************

# [可选] 设置默认用户。如果希望默认为 root,请省略。
用户 $USERNAME

提示: 如果在构建时遇到关于GID或UID已存在的错误,您选择的镜像可能已经有一个非根用户可以直接利用。

无论哪种情况,如果你已经构建了容器并连接到它,运行 Dev Containers: 重新构建容器 从命令面板 (F1) 中选择更改。否则运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。

更改现有容器的用户 UID/GID

虽然远程用户 property 尝试在 Linux 上自动更新 UID/GID(当使用 Dockerfile 或 image 时)。你可以在你的 Dockerfile 中使用此片段手动更改用户 UID/GID。更新 阿根廷适当地设置值。

ARG USERNAME=用户名-这里是占位符
ARG USER_UID=1000
ARG USER_GID=$USER_UID

运行 groupmod --gid $USER_GID $USERNAME \
    && usermod --uid $USER_UID --gid $USER_GID $USERNAME \
    && chown -R $USER_UID:$USER_GID /home/$USERNAME

请注意,在 Alpine Linux 上,您需要安装影子先打包。

运行 apk add --no-cache shadow