泊坞窗:执行所有命令为本地用户,而不是根

问题描述 投票:0回答:2

如何运行docker rundocker-compose up/run命令,从而使泊坞窗内的过程是由用户使用相同的uuid我的本地用户运行?

我需要这样做,这样的“由内泊坞窗”过程中产生的任何文件,有我的本地用户的所有权权限。

要复制:

使用alpine:3.9容器,安装在一个体积要写入的文件,并创建文件。假设我现在的用户名是user

mkdir output_dir #Create an output directory
docker run -it --rm --volume "/path/to/output_dir:/tmp" alpine:3.9 touch /tmp/file.txt
ls -la output_dir/file.txt

会给输出:

-rw-r--r-- 1 root root 0 Feb  7 19:51 /path/to/output_dir/file.txt

这意味着我需要sudo chown user:user /path/to/output_dir/file.txt有机会获得我自己的文件系统上我的当前用户。

How do I do this without this extra step?

想法浮现在脑海:

添加泊坞窗Entrypoint这将创造容器内的用户使用相同的uuid作为我的本地用户,并执行任何代码作为用户。

docker-entry point.是

#!/bin/sh
TEMP_UID="${TEMP_UID:-1000}"
set -ux
useradd -s /bin/false --no-create-home -u ${TEMP_UID} temp
#su-exec is an executable which makes it easy to run a process as a specific user.
exec su-exec temp $@

这个问题是我将在每一个TEMP_UID=<user_id>命令注入docker run作为环境变量或包括为每个docker-compose.yml命令我docker-compose up/run文件。如果Docker有,它可将运行它的用户的uuid的轨道内部变量,我只想使用。但我似乎无法找到这样一个内部变量。

任何帮助将不胜感激!

docker dockerfile file-permissions user-permissions
2个回答
1
投票

我认为答案就是这么简单

docker run --user ${UID} -it --rm --volume "/path/to/output_dir:/tmp" alpine:3.9 touch /tmp/file.txt

注意我注入--user ${UID}到实例命令。


1
投票

目前的许多选项都需要在容器外部的变化在当前用户传递,或依赖于可能不会在所有环境中存在的变量。我的首选解决方案,因为目标是修复磁盘卷上的文件权限,是与改变容器用户ID来匹配该卷安装的用户ID的脚本启动入口点为根。然后将入口点的端部推出用exec gosu $app_user_name "$@"应用从根切换一个在该容器内修改的应用程序的用户。

脚本来做到这一点是我base image repo。记下fix-perms脚本,其中包括两个部分,如下面的(一个UID,另一个用于GID)的:

# update the uid
if [ -n "$opt_u" ]; then
  OLD_UID=$(getent passwd "${opt_u}" | cut -f3 -d:)
  NEW_UID=$(stat -c "%u" "$1")
  if [ "$OLD_UID" != "$NEW_UID" ]; then
    echo "Changing UID of $opt_u from $OLD_UID to $NEW_UID"
    usermod -u "$NEW_UID" -o "$opt_u"
    if [ -n "$opt_r" ]; then
      find / -xdev -user "$OLD_UID" -exec chown -h "$opt_u" {} \;
    fi
  fi
fi

所述OLD_UID值是从所述图像中的用户ID,和NEW_UID是从卷装入。当这些不匹配,usermod命令运行,然后通过递归chown命令修复与旧的UID / GID的任何文件。

需要注意的是在生产,在主机上的用户ID可以标准化,我的主机用户ID匹配到的图像如果需要的体积,让我跑的入口点为用户而不是根源。入口点检查当前用户ID和跳过fix-perms脚本和gosu命令,如果它不是根。

© www.soinside.com 2019 - 2024. All rights reserved.