Docker 를 통해 컨테이너화시킨 젠킨스에서 볼륨으로 사용되는 디렉토리에서 권한 문제가 발생하는 경우, 이는 주로 호스트 머신에서 마운트된 디렉토리의 소유권과 권한 설정이 컨테이너 내부의 설정과 충돌하기 때문입니다. Docker 볼륨은 컨테이너의 파일 시스템과 호스트의 파일 시스템 사이에서 공유되기 때문에, 아래 사항들을 확인하고 적절히 조정해야 합니다.
1. 권한 문제가 발생하는 이유
• 호스트 디렉토리의 소유권:
Docker 컨테이너에서 실행되는 프로세스는 특정 사용자/그룹 ID로 실행됩니다(예: jenkins:jenkins).
그러나 호스트에서 마운트된 디렉토리가 root:root 또는 다른 사용자/그룹으로 설정되어 있으면, 컨테이너 내부에서 해당 디렉토리와 파일을 수정할 권한이 없을 수 있습니다.
• 디렉토리의 초기 상태:
Docker가 새 볼륨을 생성하면, 기본적으로 해당 디렉토리의 소유자는 root로 설정됩니다. 이를 명시적으로 변경하지 않으면 권한 문제가 발생할 수 있습니다.
2. 해결 방법
방법 1: 호스트 디렉토리의 소유권 변경
• 호스트 디렉토리의 소유권을 jenkins 사용자와 그룹으로 변경합니다.
sudo chown -R 1000:1000 /path/to/jenkins_home
• 여기서 1000:1000은 Jenkins 기본 사용자 및 그룹 ID입니다. 이를 확인하려면 컨테이너 내부에서 다음 명령을 실행하세요.
docker exec -it <container_name> id jenkins
방법 2: 컨테이너 시작 시 권한 설정
• Docker 컨테이너 실행 시 --user 플래그를 사용해 컨테이너 내부에서 실행될 사용자를 root로 설정한 후 필요한 권한을 수정합니다.
docker run -d --name jenkins \
-p 8080:8080 -p 50000:50000 \
-v /path/to/jenkins_home:/var/jenkins_home \
--user root \
jenkins/jenkins:lts
• 컨테이너 시작 후, /var/jenkins_home 디렉토리의 소유권을 jenkins 사용자로 변경합니다.
docker exec -it <container_name> bash
chown -R jenkins:jenkins /var/jenkins_home
exit
방법 3: Dockerfile에서 초기화
• Dockerfile에 ENTRYPOINT 스크립트를 추가하여 컨테이너 시작 시 자동으로 권한을 설정하도록 구성합니다.
#Dockerfile
FROM jenkins/jenkins:lts
USER root
RUN mkdir -p /var/jenkins_home && \
chown -R jenkins:jenkins /var/jenkins_home
USER jenkins
방법 4: Docker Compose를 사용하는 경우 권한 설정
• Docker Compose에서 UID/GID를 명시적으로 설정하여 호스트와 컨테이너 간의 사용자 권한 충돌을 방지합니다.
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
user: "1000:1000"
volumes:
- /path/to/jenkins_home:/var/jenkins_home
ports:
- "8080:8080"
- "50000:50000"
3. 권한 문제 확인
컨테이너가 실행 중일 때, 권한을 확인하여 문제가 해결되었는지 확인합니다.
docker exec -it <container_name> ls -l /var/jenkins_home
출력된 권한이 jenkins:jenkins로 올바르게 설정되어 있는지 확인하세요.
4. 주의 사항
• Jenkins는 /var/jenkins_home 디렉토리에 읽기 및 쓰기 권한이 반드시 필요합니다. 호스트 디렉토리를 마운트하는 경우, 기본적으로 Docker가 UID와 GID를 기준으로 권한을 평가하므로, 이를 맞추는 것이 중요합니다.
• Docker 볼륨을 사용할 때는 별도의 초기화 과정 없이 Docker가 관리하는 볼륨을 사용하는 것도 좋은 방법입니다. 이를 통해 권한 문제를 최소화할 수 있습니다:
docker volume create jenkins_data
docker run -d --name jenkins \
-p 8080:8080 -p 50000:50000 \
-v jenkins_data:/var/jenkins_home \
jenkins/jenkins:lts
[ 에러 예시 ]
Also: java.nio.file.FileSystemException: /var/jenkins_home/plugins/json-api/META-INF/MANIFEST.MF: Operation not permitted
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setMode(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setPermissions(Unknown Source)
at java.base/java.nio.file.Files.setPosixFilePermissions(Unknown Source)
at jenkins.util.io.PathRemover.makeWritable(PathRemover.java:283)
at jenkins.util.io.PathRemover.makeRemovable(PathRemover.java:256)
at jenkins.util.io.PathRemover.removeOrMakeRemovableThenRemove(PathRemover.java:236)
at jenkins.util.io.PathRemover.tryRemoveFile(PathRemover.java:202)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:213)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.forceRemoveRecursive(PathRemover.java:93)
Also: java.nio.file.FileSystemException: /var/jenkins_home/plugins/json-api/META-INF/maven/io.jenkins.plugins/json-api/pom.xml: Operation not permitted
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setMode(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setPermissions(Unknown Source)
at java.base/java.nio.file.Files.setPosixFilePermissions(Unknown Source)
at jenkins.util.io.PathRemover.makeWritable(PathRemover.java:283)
at jenkins.util.io.PathRemover.makeRemovable(PathRemover.java:256)
at jenkins.util.io.PathRemover.removeOrMakeRemovableThenRemove(PathRemover.java:236)
at jenkins.util.io.PathRemover.tryRemoveFile(PathRemover.java:202)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:213)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.forceRemoveRecursive(PathRemover.java:93)
Also: java.nio.file.FileSystemException: /var/jenkins_home/plugins/json-api/META-INF/maven/io.jenkins.plugins/json-api/pom.properties: Operation not permitted
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setMode(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Posix.setPermissions(Unknown Source)
at java.base/java.nio.file.Files.setPosixFilePermissions(Unknown Source)
at jenkins.util.io.PathRemover.makeWritable(PathRemover.java:283)
at jenkins.util.io.PathRemover.makeRemovable(PathRemover.java:256)
at jenkins.util.io.PathRemover.removeOrMakeRemovableThenRemove(PathRemover.java:236)
at jenkins.util.io.PathRemover.tryRemoveFile(PathRemover.java:202)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:213)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.tryRemoveDirectoryContents(PathRemover.java:223)
at jenkins.util.io.PathRemover.tryRemoveRecursive(PathRemover.java:212)
at jenkins.util.io.PathRemover.forceRemoveRecursive(PathRemover.java:93)
Also: java.nio.file.FileSystemException: /var/jenkins_home/plugins/json-api/META-INF/maven/io.jenkins.plugins/json-api: Operation not permitted
...
'Leave a note > Tools' 카테고리의 다른 글
Jmeter (2) | 2024.11.18 |
---|---|
Querypie (0) | 2024.11.11 |
Ansible (앤시블) (0) | 2024.10.28 |
[툴] 각종 유틸리티 페이지 (0) | 2023.02.01 |
[SourceTree] 소스트리 SSH Clone (2) | 2020.08.06 |