使用自定义非 root 用户运行 Docker 容器:同步主机和容器权限
介绍
Docker 已经成为开发人员在可移植、一致的环境中创建、部署和运行应用程序的流行平台。
默认情况下,Docker 容器以 root 用户身份运行,如果容器受到攻击,则可能带来安全风险。
此外,在主机和 Docker 容器之间共享文件夹时,以 root 用户身份运行也可能存在问题。
为了降低这些风险,我们将讨论使用与主机 Linux 用户的用户 ID(UID
)和组 ID(GID
)相匹配的自定义非 root 用户运行 Docker 容器,以确保对已挂载文件夹进行无缝的权限处理。
运行(主要)非 root 用户执行的 docker build 命令可能会强制我们使用sudo
某些命令。
使用无人值守脚本运行 docker 本身也会出现同样的情况。
您可能需要提升权限才能执行特定任务。
向非 root 用户授予无密码的 sudo 权限,可以让您执行管理任务,而无需承担以 root 用户身份运行整个容器的风险。
以下是使用非 root 用户和无密码 sudo 权限创建和运行 Docker 容器的步骤:
步骤 1:调整 Dockerfile 以接受 UID 和 GID 作为参数
修改 Dockerfile,使其接受主机的 UID 和 GID 作为参数。这样,您就可以在容器中创建具有匹配 UID 和 GID 的用户。
将以下几行添加到 Dockerfile:
FROM ubuntu
ARG UID
ARG GID
# Update the package list, install sudo, create a non-root user, and grant password-less sudo permissions
RUN apt update && \
apt install -y sudo && \
addgroup --gid $GID nonroot && \
adduser --uid $UID --gid $GID --disabled-password --gecos "" nonroot && \
echo 'nonroot ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# Set the non-root user as the default user
USER nonroot
第 2 步:设置工作目录
设置非 root 用户可以访问的工作目录。将以下行添加到 Dockerfile:
# Set the working directory
WORKDIR /home/nonroot/app
这会将工作目录设置为“/home/nonroot/app”,非 root 用户具有读写权限。
步骤3:复制文件并设置权限
确保非 root 用户具有访问复制文件所需的权限。将以下几行添加到 Dockerfile:
# Copy files into the container and set the appropriate permissions
COPY --chown=nonroot:nonroot . /home/nonroot/app
RUN chmod -R 755 /home/nonroot/app
步骤 4:使用 UID 和 GID 参数构建并运行 Docker 容器
现在,您可以构建 Docker 镜像并使用自定义非 root 用户运行容器。将主机的 UID 和 GID 作为构建参数传递,以创建具有匹配权限的用户。
使用以下命令构建并运行容器:
# Get your host's UID and GID
export HOST_UID=$(id -u)
export HOST_GID=$(id -g)
# Build the Docker image
docker build --build-arg UID=$HOST_UID --build-arg GID=$HOST_GID -t your-image-name .
# Run the Docker container
docker run -it --rm --name your-container-name your-image-name id
docker 输出将是:uid=1000(nonroot) gid=1000(nonroot) groups=1000(nonroot)
可选 - 添加 Docker Compose 以运行自定义非 Root 用户容器
Docker Compose 是一个用于定义和运行多容器应用程序的工具,它使用 YAML 文件来配置应用程序的服务、网络和卷。
它简化了容器管理,尤其是在处理多个服务时。
本节将讨论如何使用 Docker Compose 以与主机的 UID 和 GID 匹配的自定义非 root 用户身份运行 Docker 容器。在项目目录中
创建一个docker-compose.yml
包含以下内容的文件:
version: '3.8'
services:
your_service_name:
build:
context: .
args:
UID: ${HOST_UID}
GID: ${HOST_GID}
image: your-image-name
container_name: your-container-name
volumes:
- ./app:/home/nonroot/app
your_service_name
此 YAML 文件使用当前目录中的 Dockerfile定义了一个服务。该部分从主机环境变量和build
传递和构建参数。该部分将本地目录 ( ) 映射到容器的工作目录 ( ),以确保对已挂载文件夹进行无缝的权限处理。UID
GID
HOST_UID
HOST_GID
volumes
./app
/home/nonroot/app
首先,要使用 Docker Compose 运行容器,请在主机系统中设置环境变量。HOST_UID
以下 命令将构建 Docker(如果需要)、启动它、打印用户 ID 并移除容器:HOST_GID
HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose run --rm your_service_name id
结论
使用与主机 UID 和 GID 匹配的自定义非 root 用户运行 Docker 容器,可确保挂载文件夹的权限处理无缝衔接,同时保持安全性。
优化 Dockerfile 并组合 RUN 命令可以减小镜像大小并提升性能。遵循以下步骤将帮助您使用与主机权限一致的非 root 用户创建和运行 Docker 容器,从而降低潜在安全漏洞和权限问题的风险。部署应用程序和容器时,务必优先考虑安全性,以确保环境安全稳定。
将 Docker Compose 集成到您的工作流程中可以简化容器管理并改善整体开发体验,让您专注于构建应用程序。
链接:https://dev.to/izackv/running-a-docker-container-with-a-custom-non-root-user-syncing-host-and-container-permissions-26mb