解决容器与宿主机目录权限问题
问题描述
直接运行docker容器的默认用户是root,在容器内新建文件会变成root用户的文件,这样在宿主机上就无法操作这些文件,这样就会导致权限问题。
解决方法
- 在运行容器的时候指定用户
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就无法连接进容器中
- 在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
|
- 使用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;"]
|
- docker run
1
| docker run --rm -it -u $(id -u):$(id -g) image_name
|