..

docker指定用户运行容器

在使用prometheus的时候,prometheus产生的文件的用户名总是nobody,并且给prometheus挂在的文件都没有读写权限,让我意识到,容器内部的权限也是一个不可忽视的问题。所以你不想容器打印出来日志,运维同事没有读取的权限,那么你就应该至容器运行的时候指定用户的运行用户。

dockerdocker-compose都提供了指定容器运行用近乎的方法。docker指定运行用户:

docker run -u user iamge

具体说明如下

[hellojukay@localhost ~]$ docker run --help | grep user
  -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
[hellojukay@localhost ~]$ 

这里可以使用username也可以使用uid,但是有一点区别的是,如果是用username,那么容器里面也必须存在这个同样名字的user,如果是使用uid,那么就没有这个要求。所以大部分情况下,我们使用uid来指定用户和用户组。 docker-compose指定某个容器运行时用户方法如下:

# This is an abbreviated example docker-compose.yml
version: '3.3'
services:
  rspec:
    image: my-docker/my-build-environment:latest
    environment:
      - RAILS_ENV=test
    command: ["make", "assets"]
    # THIS BIT!!!1!
    user: ${CURRENT_UID}
    volumes:
      - .:/app

那么我们启动的这个docker-compose的时候:

CURRENT_UID=$(id -u):$(id -g) docker-compose up

这是使用当前shell用户运行容器,也可以是别的用户

CURRENT_UID=$(id -ujukay):$(id -g jukay) docker-compose up

2018年10月15日更新

让容器用指定用户的运行的前提是:容器中有这个用户,不然容器中的程序还是会使用root运行。

package main

import "time"
import "fmt"

func main() {
	for {
		time.Sleep(time.Duration(1) * time.Second)
		fmt.Println(time.Now())
	}
}

Dockerfile

FROM alpine

RUN mkdir /app
COPY code /app/
RUN adduser -S  infra
RUN echo 'infra:hello' | chpasswd 
USER infra
CMD /app/code

查看容器运行的用户

[hellojukay@localhost code]$ docker run -itd test test
1618cbce9a69404edc2612d03a2484d9977263d90a83e1d18ea29cbb567f9395
[hellojukay@localhost code]$ docker exec -it test sh
/ $ whoami
infra

这里我们看到容器已经是使用我们指定的infra用户运行了。