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可以动态传入,不想也可以单独传入不一样的uiddocker 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