以非root用户身份在docker容器中运行进程的最佳方法是什么?在主机和Docker组中添加用户,或者通过在Dockerfile中创建用户和组来添加用户
答案 0 :(得分:2)
以非root用户身份在docker容器中运行进程的最佳方法是什么。
是通过在dockerfile中创建一个具有大于或等于1000
的用户ID的非特权用户,并确保该用户是启动docker容器时的默认用户。
在主机和泊坞窗组中添加用户
主机不与docker容器共享用户或组,仅共享内核。
或通过创建用户和组作为Dockerfile的一部分
是的,这是我已经提到的正确方法。
FROM debian:9
RUN apt update && \
apt upgrade -y && \
# Adjust the user id 1000 to match the user id in your Linux host
useradd -m -u 1000 -s /usr/bin/bash stackoverflow
# Ensures that the docker container always start with this user, unless we
# explicit override it with docker run --user username ....
USER stackoverflow
# The default dir when starting the docker container.
WORKDIR /home/stackoverflow
CMD bash
建立它:
sudo docker build --tag stackoverflow .
我们首先在主机中创建一个文件以映射到docker容器中:
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ printf "\nHost user: $(id -un) with id: $(id -u)\n" > usernames.txt
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ ls -al
total 16
drwxr-xr-x 2 exadra37 exadra37 4096 Aug 3 09:58 .
drwxr-xr-x 6 exadra37 exadra37 4096 Aug 2 18:59 ..
-rw-r--r-- 1 exadra37 exadra37 173 Aug 2 19:18 Dockerfile
-rw-r--r-- 1 exadra37 exadra37 82 Aug 3 09:59 usernames.txt
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ cat usernames.txt
Host user: exadra37 with id: 1000
使用刚刚在主机中创建的文件运行docker容器:
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ sudo docker run --rm -v $PWD/usernames.txt:/home/stackoverflow/usernames.txt -it stackoverflow bash
现在我们在docker容器中:
stackoverflow@367236be38d1:~$ ls -al
total 28
drwxr-xr-x 1 stackoverflow stackoverflow 4096 Aug 3 08:58 .
drwxr-xr-x 1 root root 4096 Aug 2 18:19 ..
-rw-r--r-- 1 stackoverflow stackoverflow 220 May 15 2017 .bash_logout
-rw-r--r-- 1 stackoverflow stackoverflow 3526 May 15 2017 .bashrc
-rw-r--r-- 1 stackoverflow stackoverflow 675 May 15 2017 .profile
-rw-r--r-- 1 stackoverflow stackoverflow 36 Aug 3 08:58 usernames.txt
stackoverflow@367236be38d1:~$ cat usernames.txt
Host user: exadra37 with id: 1000
正如我们在上面看到的,我们可以读取在主机中创建的文件,甚至可以将其保存到其中:
stackoverflow@367236be38d1:~$ printf "\nContainer user: $(id -un) with id: $(id -u)\n" >> usernames.txt
让我们再次读取文件:
stackoverflow@367236be38d1:~$ cat usernames.txt
Host user: exadra37 with id: 1000
Container user: stackoverflow with id: 1000
我们可以看到文件包含另一行,并且可以看到,尽管用户名不同,但主机和容器用户的用户ID相同,这使我们之间没有权限问题。主机和容器。
让我们手动确认容器中的用户名和ID:
stackoverflow@367236be38d1:~$ id -u
1000
stackoverflow@367236be38d1:~$ id -un
stackoverflow
现在在主机中:
stackoverflow@367236be38d1:~$ exit
exit
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ id -u
1000
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ id -un
exadra37
我们可以看到它们与保存到文件中的相同,并且即使用户名不同,您也可以在主机和Docker容器之间看到相同的用户ID。对于linux来说,重要的是用户ID,用户名只是为了帮助我们人类。
在完成之前,请确保主机中的文件反映了我们在docker容器中对其所做的更改:
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤ cat usernames.txt
Host user: exadra37 with id: 1000
Container user: stackoverflow with id: 1000
╭─exadra37@laptop ~/Developer/StackOverflow/57331317
╰─➤