|
| 1 | +--- |
| 2 | +title: Jenkins에서 docker build시, docker.sock 권한 에러 발생 해결 |
| 3 | +date: 2024-08-28 17:00:00 +0900 |
| 4 | +categories: [Project, POCHAK] |
| 5 | +tags: [backend, infra, jenkins, troubleshooting] # TAG names should always be lowercase |
| 6 | +--- |
| 7 | + |
| 8 | +# 에러 상황 |
| 9 | + |
| 10 | +## 발생 위치 |
| 11 | + |
| 12 | +Jenkins에서 배포 과정을 실행하며 다음과 같은 오류가 발생하였습니다. |
| 13 | + |
| 14 | + |
| 15 | +_에러 발생!!_ |
| 16 | + |
| 17 | +- 에러가 발생한 파이프라인의 명렁어 |
| 18 | + |
| 19 | +``` bash |
| 20 | +$ docker build -f Dockerfile -t pochakgreen/pochak-dev . |
| 21 | +``` |
| 22 | + |
| 23 | +## 원인 확인 |
| 24 | + |
| 25 | +아래의 로그로 확인해봤을때, `docker.sock` 실행 과정에서 `permission denied` 권한 에러가 발생하였습니다. |
| 26 | + |
| 27 | +에러 해결과정을 정리해보겠습니다! |
| 28 | + |
| 29 | +- 로그 |
| 30 | + |
| 31 | +``` |
| 32 | +jenkins@fbfbfcdce8e0:~/workspace/dev-pipeline$ docker build -f Dockerfile -t pochakgreen/pochak-dev . |
| 33 | +DEPRECATED: The legacy builder is deprecated and will be removed in a future release. |
| 34 | + Install the buildx component to build images with BuildKit: |
| 35 | + https://docs.docker.com/go/buildx/ |
| 36 | +
|
| 37 | +permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: |
| 38 | +
|
| 39 | +... |
| 40 | +
|
| 41 | +: dial unix /var/run/docker.sock: connect: permission denied |
| 42 | +``` |
| 43 | + |
| 44 | +# 환경 |
| 45 | + |
| 46 | +## 호스트 환경 |
| 47 | +- Ubuntu 20.04.6 LTS |
| 48 | +- Docker version 27.1.2 |
| 49 | +- Jenkins Version 2.473 : 도커 컨테이너로 실행 |
| 50 | + |
| 51 | +## 도커 컨테이너 |
| 52 | + |
| 53 | +다음과 같은 명령어를 통해 도커 소켓을 마운트해서 Jenkins 컨테이너를 실행시키고 있습니다. |
| 54 | + |
| 55 | +``` bash |
| 56 | +$ docker run \ |
| 57 | + -itd --name jenkins \ |
| 58 | + -p 9090:8080 \ |
| 59 | + -v /var/run/docker.sock:/var/run/docker.sock \ |
| 60 | + -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:jdk17 |
| 61 | +``` |
| 62 | + |
| 63 | +# 해결 과정 |
| 64 | + |
| 65 | +## docker.sock의 권한 확인 |
| 66 | + |
| 67 | +먼저 docker container로 접속해서 `docker.sock`의 권한을 확인합니다. |
| 68 | + |
| 69 | +```bash |
| 70 | +$ docker exec -it jenkins /bin/bash |
| 71 | +$ ls -al /var/run/ |
| 72 | +``` |
| 73 | + |
| 74 | +`docker.sock` 파일의 그룹 권한이 이름이 없고 GID `998`로 설정되어 있는 것을 확인할 수 있습니다. |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | +> 따라서 앞으로의 해결 과정은 |
| 79 | +> 1. `docker` 그룹을 만들어서 |
| 80 | +> 2. `jenkins` 유저를 `docker` 그룹에 넣어주고, |
| 81 | +> 3. `docker` 그룹에 `docker.sock` 실행권한을 부여해줄 예정입니다. |
| 82 | +{: .prompt-tip } |
| 83 | + |
| 84 | +## `docker` 그룹 설정 |
| 85 | + |
| 86 | +먼저 젠킨스 컨테이너에 root 권한으로 접속합니다. |
| 87 | + |
| 88 | +```bash |
| 89 | +$ docker exec -itu0 jenkins /bin/bash # root로 접속 |
| 90 | +``` |
| 91 | + |
| 92 | +<br> |
| 93 | + |
| 94 | +저는 기존에 docker 그룹이 없었기 때문에 새로 생성해 주었습니다. |
| 95 | +- 이미 존재할 경우 새로 생성할 필요 없음! |
| 96 | + |
| 97 | +```bash |
| 98 | +$ groupadd docker |
| 99 | +``` |
| 100 | + |
| 101 | +<br> |
| 102 | + |
| 103 | +그 뒤, `jenkins` 유저를 그룹에 넣어주고,<br> |
| 104 | +docker 그룹에 `docker.sock` 실행권한을 부여하였습니다. |
| 105 | + |
| 106 | +```bash |
| 107 | +$ usermod -aG docker jenkins |
| 108 | +$ chown root:docker /var/run/docker.sock |
| 109 | +``` |
| 110 | + |
| 111 | + |
| 112 | + |
| 113 | +## `docker.sock` 실행권한 확인 |
| 114 | + |
| 115 | +다시 젠킨스로 접속하여 `docker.sock`의 권한을 확인하면, <br> |
| 116 | +docker 그룹에 실행 권한이 생긴걸 확인할 수 있습니다. |
| 117 | + |
| 118 | +```bash |
| 119 | +$ docker exec -itu0 jenkins /bin/bash # 다시 jenkins로 접속 |
| 120 | +$ ls -al /var/run/ |
| 121 | +``` |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +<br> |
| 126 | + |
| 127 | +또한 아래의 명령어를 통해 `docker` 그룹 안에 `jenkins` 유저가 있는 것도 확인할 수 있습니다. |
| 128 | + |
| 129 | +```bash |
| 130 | +$ cat /etc/group | grep docker |
| 131 | +``` |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +## jenkins 재시작 |
| 136 | + |
| 137 | +이렇게 권한을 모두 확인하였음에도 "바로" jenkins 파이프라인을 실행시키면, 동일한 오류가 발생합니다. |
| 138 | + |
| 139 | +<br> |
| 140 | + |
| 141 | +재시작을 하지 않고, 파이프라인에 `id` 명령어를 통해 확인해보니, `jenkins` 유저에 `docker` 그룹이 빠져있는 것을 확인할 수 있었습니다. |
| 142 | + |
| 143 | + |
| 144 | + |
| 145 | +> 참고로 터미널에서 jenkins 컨테이너에 접속해서 확인해봤을 때는 docker 그룹도 잘 나오는 상태였습니다. |
| 146 | +>  |
| 147 | +{: .prompt-info } |
| 148 | + |
| 149 | +<br> |
| 150 | + |
| 151 | +따라서 jenkins 컨테이너를 재시작하고 다시 파이프라인을 실행하면, |
| 152 | +다음과 같이 `docker` 그룹도 확인할 수 있고, |
| 153 | +배포 과정도 정상적으로 수행됩니다! |
| 154 | + |
| 155 | + |
| 156 | + |
| 157 | + |
| 158 | +_해결 완료!_ |
0 commit comments