以非root用户身份运行docker Containe进程

时间:2019-08-02 17:48:40

标签: docker dockerfile

以非root用户身份在docker容器中运行进程的最佳方法是什么?在主机和Docker组中添加用户,或者通过在Dockerfile中创建用户和组来添加用户

1 个答案:

答案 0 :(得分:2)

  

以非root用户身份在docker容器中运行进程的最佳方法是什么。

是通过在dockerfile中创建一个具有大于或等于1000的用户ID的非特权用户,并确保该用户是启动docker容器时的默认用户。

  

在主机和泊坞窗组中添加用户

主机不与docker容器共享用户或组,仅共享内核。

  

或通过创建用户和组作为Dockerfile的一部分

是的,这是我已经提到的正确方法。

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容器

我们首先在主机中创建一个文件以映射到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  
╰─➤