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