如何运行docker run
和docker-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
有机会获得我自己的文件系统上我的当前用户。
添加泊坞窗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 run --user ${UID} -it --rm --volume "/path/to/output_dir:/tmp" alpine:3.9 touch /tmp/file.txt
注意我注入--user ${UID}
到实例命令。
目前的许多选项都需要在容器外部的变化在当前用户传递,或依赖于可能不会在所有环境中存在的变量。我的首选解决方案,因为目标是修复磁盘卷上的文件权限,是与改变容器用户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
命令,如果它不是根。