当前位置: 首页 > 面试题库 >

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

糜单弓
2023-03-14
问题内容

我正在尝试使用卷共享在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共享主机环境变量?


问题答案:

该环境不是共享的,您可以使用-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。因此,您的容器不依赖于内置用户/组,您可以在没有其他脚本的情况下使用它。



 类似资料:
  • 你会用挂载点来完成这件事吗,还是有更好的方法? 谢谢

  • 问题内容: 嗨,我正在使用Docker部署一些服务,在这里我想在不同的Docker容器之间共享Docker卷。 假设我有一个Docker容器A在/ data挂载了一个卷。这是A的Dockerfile 据我了解,这会将一个卷附加到容器,但不会将主机目录装载到该容器。因此,该卷内的数据仍位于容器A内。 我有另一个提供ftp服务的容器B。它访问卷/ public下的数据。B的Dockerfile是 现在

  • 我正在使用Docker部署一些服务,我想在不同的容器之间共享Docker卷。 假设我有一个Docker容器a,它在/data处挂载了一个卷。下面是它的DockerFile: 根据我的理解,这会将卷附加到容器,但不会将主机目录挂载到容器。所以这个卷里面的数据仍然在容器A里面。

  • 我有一个docker容器运行良好。它在目录中生成一些文件。我需要这些文件做些测试。但当此容器停止时,所有内容都将被删除。所以我需要将这个文件从容器复制到主机。 我有一个python应用程序运行在生成文件的容器中。我需要一些命令或任何方式,通过这些命令,我可以在容器停止时将发送到结尾的主机。 为此,我可以使用命令,我尝试了它,但它给我一个错误,因为没有安装docker。 如何将文件从容器共享到主机?

  • 问题内容: 我不确定我在问正确的问题…但是当我阅读所有可以接触到的docker时,我发现可以在Ubuntu 12.04上安装Docker(例如),然后安装一个Fedora容器还是其他版本的ubuntu?(有一个示例,其中用户在容器中安装了busybox。) 当然,我可能完全错了。 但是,我希望基本系统与容器之间存在短暂的连接。 重述:主机操作系统和容器基础映像的操作系统之间是什么关系? 问题答案:

  • 在docker中,在容器中创建的文件在从主机检查时往往具有不可预测的所有权。默认情况下,卷上文件的所有者是root(UID0),但是一旦容器中涉及非root用户帐户并写入文件系统,从主机的角度来看,所有者或多或少就变得随机了。 当您需要使用调用docker命令的相同用户帐户从主机访问卷数据时,这是一个问题。 典型的变通办法是 null 然后检查来自主机的内容: 这个数字'100000'是我的主机用