一尘不染

使用特定的UID在主机系统和Docker容器之间共享文件

docker

我正在尝试使用卷共享在Docker guest虚拟机中共享文件。为了获得相同的UID,从而与这些文件具有互操作性,我想在Docker
guest虚拟机中创建一个与自己的用户具有相同UID的用户。

为了验证这个想法,我编写了以下简单的Dockerfile:

FROM phusion/baseimage

RUN touch /root/uid-$UID

使用进行测试docker build -t=docktest .,然后docker run docktest ls -al /root显示该文件被简单命名为uid-

在来宾构建过程中是否可以与Docker共享主机环境变量?


阅读 307

收藏
2020-06-17

共1个答案

一尘不染

该环境不是共享的,您可以使用-e,–env选项在容器中设置env变量。

当我想拥有映射卷的相同所有者时,通常使用这种方法:我检查容器中目录的uid和gid,然后创建一个相应的用户。这是我的脚本(setuser.sh),它为目录创建用户:

#!/bin/bash

setuser() {
  if [ -z "$1" ]; then
    echo "Usage: $0 <path>"
    return
  fi
  CURRENT_UID=`id -u`
  DEST_UID=`stat -c "%u" $1`
  if [ $CURRENT_UID = $DEST_UID ]; then
    return
  fi
  DEST_GID=`stat -c "%g" $1`
  if [ -e /home/$DEST_UID ]; then
    return
  fi
  groupadd -g $DEST_GID $DEST_GID
  useradd -u $DEST_UID -g $DEST_GID $DEST_UID
  mkdir -p /home/$DEST_UID
  chown $DEST_UID:$DEST_GID /home/$DEST_UID
}
setuser $1

这是包装脚本,以用户身份运行命令,其中具有权限的目录指定为$ USER_DIR或在/ etc / user_dir中

#!/bin/bash
if [ -z "$USER_DIR" ]; then
  if [ -e /etc/user_dir ]; then
    export USER_DIR=`head -n 1 /etc/user_dir`
  fi
fi
if [ -n "$USER_DIR" ]; then
  if [ ! -d "$USER_DIR" ]; then
    echo "Please mount $USER_DIR before running this script"
    exit 1
  fi
  . `dirname $BASH_SOURCE`/setuser.sh $USER_DIR
fi
if [ -n "$USER_DIR" ]; then
  cd $USER_DIR
fi
if [ -e /etc/user_script ]; then
  . /etc/user_script
fi
if [ $CURRENT_UID = $DEST_UID ]; then
  "$@"
else
  su $DEST_UID -p -c "$@"
fi

PS
Alleo建议使用不同的方法:将用户和组文件映射到容器中,并指定uid和gid。因此,您的容器不依赖于内置用户/组,您可以在没有其他脚本的情况下使用它。

2020-06-17