使用主机环境variables与Dockerfile

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

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

FROM phusion/baseimage RUN touch /root/uid-$UID 

使用docker build -t=docktest . 然后docker run docktest ls -al /root显示该文件简单地命名为uid-

在来宾生成过程中,有没有办法与Docker共享主机环境variables?

环境不共享,您可以使用-e,–env选项来设置容器中的envvariables。

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

 #!/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 

这是不可能的,并且可能永远不可能,因为保持独立于机器的构build的devise理念。 问题6822 。

我稍微修改@ISanych答案:

 #!/usr/bin/env bash user_exists() { id -u $1 > /dev/null 2>&1 } group_exists() { id -g $1 > /dev/null 2>&1 } setuser() { if [[ "$#" != 3 ]]; then echo "Usage: $0 <path> <user> <group>" return fi local dest_uid=$(stat -c "%u" $1) local dest_gid=$(stat -c "%g" $1) if user_exists $dest_uid; then id -nu $dest_uid return fi local dest_user=$2 local dest_group=$3 if user_exists $dest_user; then userdel $dest_user fi if group_exists $dest_group; then groupdel $dest_user fi groupadd -g $dest_gid $dest_group useradd -u $dest_uid -g $dest_gid -s $DEFAULT_SHELL -d $DEFAULT_HOME -G root $dest_user chown -R $dest_uid:$dest_gid $DEFAULT_HOME id -nu $dest_user } REAL_USER=$(setuser $SRC_DIR $DEFAULT_USER $DEFAULT_GROUP) 

setuser函数接受要分配给提供的目录的uid和gid的用户名和组名。 那么如果用户存在这样的uid,那么它只是简单地返回与这个uid相对应的login名,否则它将创build用户和组,并返回最初传递给函数的login名。

所以你得到拥有目的地目录的用户login。