Sonatype Nexus Repository 3 을 컨테이너로 올려 사내 아티팩트·RPM 저장소로 쓰는 구성이다. 폐쇄망에서 yum 저장소를 자체 운영할 때 자주 쓰는 형태를 정리한다.
services:
nexus:
image: sonatype/nexus3:ubi
container_name: nexus3
restart: unless-stopped
ports:
- "8081:8081" # 관리 UI
- "8083:8083" # docker(hosted) 커넥터를 쓸 때
volumes:
- nexus-data:/nexus-data
environment:
- INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g
volumes:
nexus-data:
sonatype/nexus3 는 UBI 기반 태그(:ubi)와 기본 태그를 함께 배포한다. 데이터는 전부 /nexus-data 한 곳에 모이므로 이 경로만 볼륨으로 빼면 된다. 컨테이너 안에서 UID 200 으로 돌기 때문에 호스트 디렉터리를 바인드 마운트할 때는 chown -R 200 ./nexus-data 를 먼저 해 줘야 기동한다. 이름 있는 볼륨을 쓰면 이 문제가 없다.
JVM 힙은 INSTALL4J_ADD_VM_PARAMS 로 준다. 힙과 직접 메모리를 합친 값에 여유를 더해 컨테이너 메모리 한도를 잡는다.
첫 기동 뒤 관리자 임시 비밀번호는 데이터 디렉터리에 생긴다.
docker exec nexus3 cat /nexus-data/admin.password
tar.gz 로 설치한 경우의 유닛 파일이다. 전용 계정으로 돌리고 파일 디스크립터 한도를 올린다.
# /etc/systemd/system/nexus.service
[Unit]
Description=Nexus Repository Manager 3
After=network.target
[Service]
Type=forking
User=nexus
Group=nexus
LimitNOFILE=65536
Environment="NEXUS_DATA=/opt/sonatype-work/nexus3"
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
Restart=on-abort
TimeoutSec=600
[Install]
WantedBy=multi-user.target
데이터 경로는 컨테이너·직접 설치 모두 NEXUS_DATA 환경 변수로 바꾼다. 컨테이너에서 이 값을 바꿨다면 볼륨 마운트 지점도 함께 바꿔야 한다.
관리 화면에서 Repository → Repositories → Create repository → yum (hosted) 를 만든다. Version policy 는 보통 Mixed, 필요하면 Deployment policy 를 Allow redeploy 로 둔다. 주소는 http://<호스트>:8081/repository/<이름>/ 이 된다.
RPM 업로드는 UI 의 Upload 탭이나 REST API 를 쓴다.
curl -u admin:"${NEXUS_PASSWORD}" \
-F "yum.asset=@mypackage-1.0.0-1.x86_64.rpm" \
-F "yum.asset.filename=mypackage-1.0.0-1.x86_64.rpm" \
-F "yum.directory=/" \
"http://nexus.example.com:8081/service/rest/v1/components?repository=yum-release"
Nexus 의 yum hosted 저장소는 업로드된 RPM 을 보고 repodata 를 스스로 만든다. 저장소 설정의 Repodata Depth 값이 디렉터리 구조에 맞아야 메타데이터가 올바른 위치에 생긴다 — 최상위에만 올린다면 0 이다. raw hosted 저장소에 RPM 을 올리는 경우에는 메타데이터가 만들어지지 않으므로 createrepo_c 로 만든 repodata/ 를 함께 올려야 한다.
클라이언트에는 저장소 파일을 둔다.
[nexus-yum]
name=Nexus Yum Repo
baseurl=http://nexus.example.com:8081/repository/yum-release/
enabled=1
gpgcheck=0
dnf clean all
dnf repolist