Docker Compose 로 올린 Harbor 가 기동 시도마다 Recreating ... No such container 를 반복하면서 올라오지 않는 상태다. docker rm 을 해도 같은 메시지가 나오고 install.sh 를 다시 돌려도 달라지지 않는다. 컨테이너와 compose 상태가 어긋난 것이므로 설정 파일을 고쳐서 풀리지 않는다. 데이터는 그대로 두고 실행 환경만 새로 만드는 편이 빠르다.
Harbor 는 실행 디렉터리와 데이터 디렉터리가 분리돼 있다.
| 대상 | 예 | 처리 |
|---|---|---|
데이터 볼륨 (harbor.yml 의 data_volume) |
/data 또는 /opt/harbor/data |
절대 건드리지 않는다 |
설치 디렉터리 (harbor.yml, docker-compose.yml, prepare, common/) |
/opt/harbor |
통째로 옮기고 새로 푼다 |
| 인증서 | harbor.yml 이 가리키는 경로 |
그대로 둔다 |
데이터 볼륨 안에는 레지스트리 blob, PostgreSQL 데이터, Redis 데이터가 모두 들어 있다. 이 디렉터리가 살아 있으면 이미지 · 프로젝트 · 사용자 · 권한이 전부 그대로 돌아온다.
현재 값은 설정 파일에서 확인한다. 추측하지 않는다.
grep -n 'data_volume\|hostname\|certificate\|private_key' /opt/harbor/harbor.yml
systemctl stop harbor 2>/dev/null || true
systemctl disable harbor 2>/dev/null || true
cd /opt/harbor
docker compose down --remove-orphans || true
--volumes 는 붙이지 않는다. Harbor 의 데이터는 named volume 이 아니라 bind mount 라 보통 영향이 없지만, 습관으로 붙였다가 다른 구성에서 데이터를 날리기 쉽다.
Compose 는 컨테이너에 붙은 라벨로 자기 프로젝트를 식별한다. 라벨이 붙은 컨테이너가 반쯤 남아 있으면 재생성이 계속 어긋난다.
docker ps -aq --filter 'label=com.docker.compose.project=harbor' | xargs -r docker rm -f
docker network ls --filter 'label=com.docker.compose.project=harbor' -q | xargs -r docker network rm
프로젝트 이름은 기본적으로 디렉터리 이름이다. 설치 경로가 harbor 가 아니면 그 이름으로 바꾼다.
docker inspect harbor-core --format '{{index .Config.Labels "com.docker.compose.project"}}'
이 상태가 compose 의 로컬 캐시 때문이라는 설명도 있으나 확인하지 못했다 (확인 필요). 라벨 기준으로 정리하면 원인과 무관하게 풀린다.
지우지 말고 옮긴다. 되돌릴 일이 생긴다.
cd /opt
mv harbor harbor.bak_$(date +%F)
tar xzf harbor-offline-installer-v<VERSION>.tgz
cd harbor
옮겨 둔 디렉터리의 harbor.yml 을 참고해 같은 값으로 채운다. 데이터 경로가 한 글자라도 다르면 빈 Harbor 가 올라온다.
hostname: <REGISTRY_FQDN>
https:
port: 443
certificate: /opt/cert/<REGISTRY_FQDN>.crt
private_key: /opt/cert/<REGISTRY_FQDN>.key
data_volume: /data
harbor_admin_password: ${HARBOR_ADMIN_PASSWORD}
harbor_admin_password 는 최초 설치 때만 반영된다. 이미 데이터베이스가 있으면 기존 비밀번호가 그대로 유지되므로, 여기에 새 값을 적어도 바뀌지 않는다.
./prepare
docker compose up -d
docker compose ps
prepare 가 common/config 아래의 설정을 다시 만든다. 이 디렉터리는 새로 푼 설치 디렉터리 안에 있으므로 옛것과 섞이지 않는다.
curl -sk https://<REGISTRY_FQDN>/api/v2.0/health | jq .
{"status":"healthy"}
이미지가 남아 있는지는 프로젝트 목록으로 본다.
curl -sk -u '<USER>:${PASSWORD}' https://<REGISTRY_FQDN>/api/v2.0/projects | jq -r '.[].name'
curl -sk -u '<USER>:${PASSWORD}' "https://<REGISTRY_FQDN>/api/v2.0/projects/<PROJECT>/repositories" | jq -r '.[].name'
Harbor 2.3 계열의 설치 패키지에는 harbor.yml · docker-compose.yml · prepare · install.sh · common/ 만 있고 compose_location 같은 항목은 없다. 인터넷에서 찾은 절차가 그 항목을 언급하면 다른 버전의 이야기이므로 따르지 않는다. 기준은 언제나 설치 디렉터리에 실제로 있는 파일이다.
ls -1 /opt/harbor