簡體   English   中英

在 unix:///var/run/docker.sock 拒絕 Docker 守護進程套接字的權限

[英]Permission denied to Docker daemon socket at unix:///var/run/docker.sock

我有這個Dockerfile

FROM chekote/gulp:latest 

USER root
RUN apt-get update \
      && apt-get upgrade -y \
      && apt-get install -y sudo libltdl-dev

ARG dockerUser='my-user-name';
ARG group='docker';

# crate group if not exists
 RUN if ! grep -q -E "^$group:" /etc/group; then groupadd $group; fi

# create user if not exists
 RUN if ! grep -q -E "^$dockerUser:" /etc/passwd; then useradd -c 'Docker image creator' -m -s '/bin/bash' -g $group $dockerUser; fi

# add user to the group (if it was present and not created at the line above)
 RUN usermod -a -G ${group} ${dockerUser}

# set default user that runs the container
 USER ${dockerUser}

我這樣構建:

docker build --tag my-gulp:latest .

最后以這種方式通過script運行:

#!/bin/bash

image="my-gulp:latest";
workDir='/home/gulp/project';

docker run -it --rm  \
-v $(pwd):${workDir} \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
${image} /bin/bash

讓我正確登錄到 docker 容器,但是當我想查看圖像時

docker images

或嘗試拉圖像

docker pull hello-world:latest

我收到此錯誤:

嘗試在 unix:///var/run/docker.sock 連接到 Docker 守護程序套接字時獲得權限被拒絕:獲取http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json :撥打 unix /var/run/docker.sock:連接:權限被拒絕

如何從chekote/gulp:latest創建 docker 映像,以便我可以在其中使用 docker 而不會出現錯誤?

或者錯誤可能是因為錯誤的 docker run 命令?

避免這種情況的快速方法。 將您的用戶添加到組中。

sudo gpasswd -a $USER docker

然后設置適當的權限。

sudo setfacl -m "user:$USER:rw" /var/run/docker.sock

從那里應該很好。

權限匹配僅發生在數字用戶 ID 和組 ID 上。 如果套接字文件是模式 0660 並且由用戶 ID 0 和組 ID 32 所有,並且您以用戶 ID 1000 和組 ID 1000 和 16 的用戶身份調用它,那么/etc/group文件是否無關緊要將 gid 32 命名為docker ,另一個將 gid 16 命名為相同; 數字 gid 不同,您無法訪問該文件。 此外,由於 Docker 組的實際數字 gid 會因系統而異,所以這不是您可以寫入 Dockerfile 的內容。

許多 Docker 鏡像只是以 root 身份運行; 如果他們這樣做,他們可以訪問綁定安裝的 Docker 套接字文件,而不管其權限如何。

如果您以非 root 用戶身份運行,則可以使用docker run --group-add選項為有效用戶添加(數字)gid; 它不需要在/etc/groups文件中特別提及。 在 Linux 主機上,您可能會運行:

docker run --group-add $(stat -c '%g' /var/run/docker.sock) ...

您通常不會在 Dockerfile 中安裝sudo (它不適用於非交互式程序,由於容器的短暫性,您通常不會在交互式 shell 中做很多事情,而且您總是可以docker exec -u 0獲取 root shell)雖然安裝一些非 root 用戶通常被認為是最佳實踐。 您可以將 Dockerfile 減少到

FROM node:8
RUN apt-get update
# Trying to use the host's `docker` binary may not work well
RUN apt-get install -y docker.io
# Install the single node tool you need
RUN npm install -g gulp
# Get your non-root user
RUN adduser myusername
# Normal Dockerfile bits
WORKDIR ...
COPY ...
RUN gulp
USER myusername
CMD ["npm", "run", "start"]

該 Docker 基礎鏡像一些與 Docker 最佳實踐不匹配東西,並且似乎沒有定期更新;我只是使用標准node鏡像作為基礎並添加您需要的一個構建工具在它的上面。)

打開終端並輸入此命令

sudo chmod 666 /var/run/docker.sock

讓我知道結果...

該錯誤與 docker pull 或 docker image 子命令無關,而是您需要以對 docker 套接字具有寫訪問權限的用戶身份調用 docker 命令(例如,作為 root、使用 sudo 或通過碼頭工人組)。

您的 docker run 命令需要 --privileged 標志。

順便說一句,對於這種用例,您可以只使用 docker 中的 docker,來自 docker 的圖像。

https://asciinema.org/a/24707

https://hub.docker.com/_/docker/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM