代码之家  ›  专栏  ›  技术社区  ›  Frank-Rene Schäfer

Docker:将外部映射到内部用户(如何应用“--user”,howte execute.bashrc)?

  •  0
  • Frank-Rene Schäfer  · 技术社区  · 8 年前

    使用命令行运行Docker映像,例如:

    > docker run -it -v $OutsideDir:$InsideDir -u $(id -u):$(id -g) c0ffeebaba bash
    

    作为主机上的当前用户,我可以从Docker容器内部处理我的数据。但是,在容器“whoami”中询问会给出这样的响应:uid未知。

    所以shell是在没有主目录的用户上执行的。怎么 我能为那个用户完成一些初始化吗?是否有方法从内部将外部用户的用户ID和组ID映射到特定的用户名?这可以动态地完成,以便它可以为任何用户工作,如上面所示通过“--user”标志指定?

    我的第一个方法是在dockerfile中使用“cmd”,例如

    CMD ["source", "/home/the_user/.bashrc" ]
    

    但是,这行不通。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Anya Shenanigans    8 年前

    一个相对简单的解决方案是用脚本包装Docker运行,在 /etc/passwd /etc/group 文件从主机到容器,以及用户的主目录,因此类似于:

    #!/bin/bash -p
    
    # command starts with mapping passwd and group files
    cmd=(docker run -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro)
    # add home directory:
    myhome=$(getent passwd $(id -nu) | awk -F: '{print $6}')
    cmd+=(-v $myhome:$myhome)
    # add userid and groupid mappings:
    cmd+=(-u $(id -u):$(id -g))
    
    # then pass through any other arguments:
    cmd+=("$@")
    
    "${cmd[@]}"
    

    这可以运行为:

    ./runit.sh -it --rm alpine id
    

    或者,对于shell(默认情况下,alpine没有bash):

    ./runit.sh -it --rm centos bash --login
    

    你可以扔一个 -w $HOME 让它在用户的主目录等中启动。

    推荐文章