docker fixuid

docker fixuid

  • 一、fixuid是什么
  • 二、使用场景
  • 三、问题
    • dockerfile
    • docker run

一、fixuid是什么

fixuid是用go语言编写的,当容器起来后可以修改容器中非root用户的UID/GID和文件权限。
项目地址:https://github.com/boxboat/fixuid

二、使用场景

当容器中的用户为UID:1000,GID:1000,HOST主机的用户为UID:1001, GID:1002,此时挂载数据卷,会提示提示”permission denied”。
通过使用fixuid,在容器启动时,当HOST主机的UID/GID传进去,fixuid会将容器中用户的UID改成1001,GID改成1002,并且该用户下的所有文件权限也会改成1001:1002。由于容器内外用户的UID/GID一致,此时再挂载数据卷不会由任何问题。

三、问题

默认情况下,容器中的进程以 root 用户执行,并且这个 root 用户和宿主机中的 root 是同一个用户,这意味着:
1.容器中运行的进程,在合适的机会下,有权限控制宿主机中的一切;
2.容器中运行的进程,以 root 用户执行,外界很难追溯到真实的用户;
3.容器进程生成的文件,是 root 用户所有,普通用户没有权限读取修改。(fixuid可以自定义容器内普通用户的uid,如果固定住了可以让拥有同样uid的宿主机使其目录做挂载做到权限分离)

dockerfile

#在线部分
RUN USER=docker && \
    GROUP=docker && \
    curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.5.1/fixuid-0.5.1-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
    chown root:root /usr/local/bin/fixuid && \
    chmod 4755 /usr/local/bin/fixuid && \
    mkdir -p /etc/fixuid && \
    printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml
#离线全部
FROM debian:latest
COPY fixuid-0.4.1-linux-amd64.tar.gz /opt
RUN useradd -m docker
RUN USER=docker && \
    GROUP=docker && \
    tar -xzf /opt/fixuid-0.4.1-linux-amd64.tar.gz -C /usr/local/bin && \
    chown root:root /usr/local/bin/fixuid && \
    chmod 4755 /usr/local/bin/fixuid && \
    mkdir -p /etc/fixuid && \
    printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml
USER docker:docker
ENTRYPOINT ["fixuid"]

docker run

#这里没有写死uid,需要同普通用户一样uid可以动态传入,不想也可以单独传入不一样的uid
 docker run --rm -it -u 1001:1000 vm01:v1  sh
fixuid: fixuid should only ever be used on development systems. DO NOT USE IN PRODUCTION
fixuid: updating user 'docker' to UID '1001'
fixuid: runtime GID '1000' already matches container group 'docker' GID
fixuid: recursively searching path /
fixuid: chown /home/docker
fixuid: chown /home/docker/.bash_logout
fixuid: chown /home/docker/.bashrc
fixuid: chown /home/docker/.profile
$ id
uid=1001(docker) gid=1000(docker) groups=1000(docker)

# 换了普通的镜像
docker run --rm -it -u 1002:1001 centos:centos7  bash
bash-4.2$ id
uid=1002 gid=1001 groups=1001
bash-4.2$ exit

你可能感兴趣的:(docker,容器,运维)