Docker Notes

解决容器与宿主机目录权限问题

问题描述

直接运行docker容器的默认用户是root,在容器内新建文件会变成root用户的文件,这样在宿主机上就无法操作这些文件,这样就会导致权限问题。

解决方法

  1. 在运行容器的时候指定用户
1
docker run -it --rm -v /home/username:/home/username --user $(id -u):$(id -g) ubuntu:18.04

如果这样直接指定用户的话,由于容器内没有这个用户,虽然容器可以正常运行,但是命令行提示符会变成I have no name!@xxxx。 同时,如果直接使用这样的方式创建容器,容器内没有root权限,会导致一些命令无法执行。比如vscode就无法连接进容器中

  1. 在Dockerfile中指定用户
1
2
3
4
5
6
7
8
9
10
11
RUN useradd --create-home --no-log-init --shell /bin/bash username \
&& adduser username sudo \
&& usermod -a -G sudo username \
&& echo 'username:userpasswd' | chpasswd \
&& mkdir -p /etc/sudoers.d \
&& echo "username ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/username \
&& chmod 0440 /etc/sudoers.d/username \
&& USER=username \
&& GROUP=username

USER username:username
  1. 使用fixuid修复容器中的用户名

fixuid可以修复容器中的用户名,使得容器中的用户名和宿主机中的用户名一致,这样就可以避免权限问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM debian:latest
COPY fixuid-0.5.1-linux-amd64.tar.gz /opt
RUN useradd -m docker && \
apt-get -y install nginx
RUN USER=docker && \
GROUP=docker && \
tar -xzf fixuid-0.5.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
ENTRYPOINT ["fixuid"]
USER docker:docker
CMD ["nginx", "-g", "daemon off;"]
  1. docker run
1
docker run --rm -it -u $(id -u):$(id -g) image_name