2 min read

使用非root来耍docker

使用非root来耍docker

背景

总有一些场景不允许直接使用root用户(嗯?会议评审下,邮件发一下...),只能操作普通账户,然而又需要使用docker应用来构建镜像或者是使用docker跑些测试样例。

实现

使用非root运行docker命令,不出意外的话就会弹出以下无权限的警示。

$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

由于我的docker环境是直接使用二进制来安装的(非yum与apt),于是我采用以下姿势来处理:

# export USER=vqiu
# setfacl -m user:$USER:rw /var/run/docker.sock

此时再使用docker命令就一片祥和了,但是只要docker服务重启便又回到无权限的起点。这好办,直接在docker的systemd中追加以下内容:

ExecStartPost=/usr/bin/setfacl -m user:vqiu:rw /var/run/docker.sock
提示:如果是多个普通用户就使用组的概念来维护!

此时,systmed中的docker.service内容如下:

systemctl cat docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment="PATH=/bin:/sbin:/usr/bin:/usr/sbin"
Environment=GOTRACEBACK=crash

ExecStart=/usr/bin/dockerd $OPTIONS \
                           $DOCKER_STORAGE_OPTIONS \
                           $DOCKER_NETWORK_OPTIONS \
                           $INSECURE_REGISTRY
ExecStartPost=/usr/bin/setfacl -m user:vqiu:rw /var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target