컨테이너 레지스트리 메타데이터 데이터베이스 문제 해결
Offering: GitLab Self-Managed
레지스트리가 업데이트되고 보류 중인 스키마 마이그레이션이 있는 경우, 레지스트리는 다음 오류 메시지와 함께 시작에 실패합니다: 이 문제를 해결하려면 데이터베이스 마이그레이션 적용 단계를 따르십시오. 18.3 이전 버전에서는 각 버전 업그레이드 시 수동으로 데이터베이스 마이그레이션을 적용해야 합니다.
오류: there are pending database migrations#
레지스트리가 업데이트되고 보류 중인 스키마 마이그레이션이 있는 경우, 레지스트리는 다음 오류 메시지와 함께 시작에 실패합니다:
FATA[0000] configuring application: there are pending database migrations, use the 'registry database migrate' CLI command to check and apply them
이 문제를 해결하려면 데이터베이스 마이그레이션 적용 단계를 따르십시오.
18.3 이전 버전에서는 각 버전 업그레이드 시 수동으로 데이터베이스 마이그레이션을 적용해야 합니다.
오류: offline garbage collection is no longer possible#
레지스트리가 메타데이터 데이터베이스를 사용하는데 오프라인 가비지 컬렉션을 실행하려고 하면, 레지스트리가 다음 오류 메시지와 함께 실패합니다:
ERRO[0000] this filesystem is managed by the metadata database, and offline garbage collection is no longer possible, if you are not using the database anymore, remove the file at the lock_path in this log message lock_path=/docker/registry/lockfiles/database-in-use
다음 중 하나를 수행해야 합니다:
- 오프라인 가비지 컬렉션 사용을 중단합니다.
- 메타데이터 데이터베이스를 더 이상 사용하지 않는 경우, 오류 메시지에 표시된
lock_path에 있는 잠금 파일을 삭제합니다. 예를 들어,/docker/registry/lockfiles/database-in-use파일을 제거합니다.
오류: cannot execute in a read-only transaction#
레지스트리가 다음 오류 메시지와 함께 데이터베이스 마이그레이션 적용에 실패할 수 있습니다:
err="ERROR: cannot execute CREATE TABLE in a read-only transaction (SQLSTATE 25006)"
또한 온라인 가비지 컬렉션을 실행하려고 하면 레지스트리가 다음 오류 메시지와 함께 실패할 수 있습니다:
error="processing task: fetching next GC blob task: scanning GC blob task: ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction (SQLSTATE 25006)"
PostgreSQL 콘솔에서 default_transaction_read_only 및 transaction_read_only 값을 확인하여 읽기 전용 트랜잭션이 비활성화되어 있는지 확인해야 합니다.
예를 들어:
# SHOW default_transaction_read_only;
default_transaction_read_only
-------------------------------
on
(1 row)
# SHOW transaction_read_only;
transaction_read_only
-----------------------
on
(1 row)
이 값 중 하나라도 on으로 설정된 경우 비활성화해야 합니다:
-
postgresql.conf를 편집하고 다음 값을 설정합니다:default_transaction_read_only=off -
Postgres 서버를 재시작하여 이 설정을 적용합니다.
-
해당하는 경우 데이터베이스 마이그레이션 적용을 다시 시도합니다.
-
레지스트리를 재시작합니다:
sudo gitlab-ctl restart registry.
오류: cannot import all repositories while the tags table has entries#
기존 레지스트리 메타데이터 가져오기를 시도하고 다음 오류를 만나면:
ERRO[0000] cannot import all repositories while the tags table has entries, you must truncate the table manually before retrying,
see https://docs.gitlab.com/administration/packages/container_registry_metadata_database/#troubleshooting
common_blobs=true dry_run=false error="tags table is not empty"
이 오류는 레지스트리 데이터베이스의 tags 테이블에 기존 항목이 있을 때 발생합니다. 이는 다음과 같은 경우에 발생할 수 있습니다:
- 단계별 가져오기를 시도했다가 오류가 발생한 경우.
- 3단계 가져오기 프로세스를 시도했다가 오류가 발생한 경우.
- 가져오기 프로세스를 의도적으로 중단한 경우.
- 이전 작업 후 가져오기를 다시 실행하려고 한 경우.
- 잘못된 구성 파일에 대해 가져오기를 실행한 경우.
이 문제를 해결하려면 tags 테이블의 기존 항목을 삭제해야 합니다. PostgreSQL 인스턴스에서 테이블을 수동으로 잘라야 합니다:
-
/etc/gitlab/gitlab.rb를 편집하고 메타데이터 데이터베이스가 비활성화되어 있는지 확인합니다:registry['database'] = { 'enabled' => false, } -
PostgreSQL 클라이언트를 사용하여 레지스트리 데이터베이스에 연결합니다.
-
모든 기존 항목을 제거하기 위해
tags테이블을 잘라냅니다:TRUNCATE TABLE tags RESTART IDENTITY CASCADE; -
tags테이블을 잘라낸 후 가져오기 프로세스를 다시 실행합니다.
오류: database-in-use lockfile exists#
기존 레지스트리 메타데이터 가져오기를 시도하고 다음 오류를 만나면:
| [0s] step two: import tags failed to import metadata: importing all repositories: 1 error occurred:
* could not restore lockfiles: database-in-use lockfile exists
이 오류는 이전에 레지스트리를 가져와 모든 저장소 데이터 가져오기(2단계)를 완료했고, database-in-use가 레지스트리 파일 시스템에 존재한다는 것을 의미합니다.
이 문제가 발생하면 가져오기 도구를 다시 실행해서는 안 됩니다.
계속 진행해야 하는 경우 파일 시스템에서 database-in-use 잠금 파일을 수동으로 삭제해야 합니다.
파일은 /path/to/rootdirectory/docker/registry/lockfiles/database-in-use에 위치합니다.
오류: pre importing all repositories: AccessDenied:#
AWS S3를 스토리지 백엔드로 사용하고 기존 레지스트리 가져오기를 수행할 때 AccessDenied 오류가 발생할 수 있습니다:
/opt/gitlab/embedded/bin/registry database import --step-one /var/opt/gitlab/registry/config.yml
[0s] step one: import manifests
[0s] step one: import manifests failed to import metadata: pre importing all repositories: AccessDenied: Access Denied
명령을 실행하는 사용자에게 올바른 권한 범위가 있는지 확인하십시오.
메타데이터 관리 문제로 인한 레지스트리 시작 실패#
다음 오류 중 하나와 함께 레지스트리가 시작에 실패할 수 있습니다:
오류: registry filesystem metadata in use, please import data before enabling the database#
이 오류는 구성에서 데이터베이스가 활성화되어 있지만(registry['database'] = { 'enabled' => true}) 메타데이터 데이터베이스로 기존 레지스트리 메타데이터 가져오기를 아직 완료하지 않았을 때 발생합니다.
오류: registry metadata database in use, please enable the database#
이 오류는 메타데이터 데이터베이스로 기존 레지스트리 메타데이터 가져오기를 완료했지만, 구성에서 데이터베이스를 활성화하지 않았을 때 발생합니다.
잠금 파일 확인 또는 생성 문제#
다음 오류 중 하나가 발생하면:
could not check if filesystem metadata is lockedcould not check if database metadata is lockedfailed to mark filesystem for database only usagefailed to mark filesystem only usage
레지스트리가 구성된 rootdirectory에 액세스할 수 없습니다. 이전에 작동 중인 레지스트리가 있었다면 이 오류가 발생할 가능성은 낮습니다. 오류 로그에서 잘못된 구성 문제를 검토하십시오.
태그 삭제 후 스토리지 사용량이 감소하지 않음#
기본적으로 온라인 가비지 컬렉터는 관련된 모든 태그가 삭제된 시점으로부터 48시간이 지나야 참조되지 않는 레이어 삭제를 시작합니다. 이 지연은 가비지 컬렉터가 장기 실행 또는 중단된 이미지 푸시와 충돌하지 않도록 하기 위한 것입니다. 레이어는 이미지 및 태그와 연결되기 전에 레지스트리에 푸시되기 때문입니다.
오류: permission denied for schema public (SQLSTATE 42501)#
레지스트리 마이그레이션 또는 GitLab 업그레이드 중에 다음 오류 중 하나가 발생할 수 있습니다:
ERROR: permission denied for schema public (SQLSTATE 42501)ERROR: relation "public.blobs" does not exist (SQLSTATE 42P01)
이러한 유형의 오류는 보안 이유로 공개 스키마에 대한 기본 CREATE 권한을 제거한 PostgreSQL 15+의 변경으로 인한 것입니다. 기본적으로 PostgreSQL 15+에서는 데이터베이스 소유자만 공개 스키마에 객체를 생성할 수 있습니다.
오류를 해결하려면 다음 명령을 실행하여 레지스트리 사용자에게 레지스트리 데이터베이스의 소유자 권한을 부여합니다:
ALTER DATABASE <registry_database_name> OWNER TO <registry_user>;
이렇게 하면 레지스트리 사용자에게 테이블을 생성하고 마이그레이션을 성공적으로 실행하는 데 필요한 권한이 부여됩니다.
오류: database-in-use and filesystem-in-use lockfiles present#
이 오류는 filesystem-in-use 및 database-in-use 잠금 파일이 모두 구성된 레지스트리 스토리지에 있을 때 발생하며 모호한 레지스트리 상태를 나타냅니다.
이 오류를 해결하려면 레지스트리가 메타데이터 데이터베이스 또는 레거시 메타데이터 스토리지를 사용하도록 되어 있는지 확인해야 합니다.
다음과 같은 경우 레지스트리가 메타데이터 데이터베이스를 사용하도록 설계되었을 가능성이 높습니다:
- 가져오기 프로세스 중 하나를 이전에 수행한 경우.
- 레지스트리 구성에서 레지스트리가 활성화된 것으로 표시된 경우.
/etc/gitlab/gitlab.rb 파일을 확인하여 레지스트리가 활성화되어 있는지 확인합니다:
registry['database'] = {
'enabled' => true,
}
레지스트리가 데이터베이스를 사용하도록 설계되었음을 확인한 후, /docker/registry/lockfiles/filesystem-in-use에 위치한 구성된 레지스트리 스토리지의 filesystem-in-use 잠금 파일을 삭제합니다.
또는 위의 시나리오가 해당하지 않고 레지스트리가 레거시 메타데이터 스토리지를 사용하도록 설계된 경우, /docker/registry/lockfiles/database-in-use의 database-in-use 잠금 파일을 삭제합니다.
GitLab 18.8 및 18.9의 경우, REGISTRY_FF_ENFORCE_LOCKFILES 컨테이너 레지스트리 기능 플래그를 false로 설정하여 잠금 파일 검사를 비활성화할 수 있습니다.
이 설정으로 검사가 비활성화되지만, 이 오류는 레지스트리 데이터의 무결성을 보장하기 위한 것이므로 사용 중인 메타데이터 스토리지를 확인하는 것이 좋습니다. REGISTRY_FF_ENFORCE_LOCKFILES 기능 플래그는 GitLab 18.10에서 제거되었습니다. 자세한 내용은 컨테이너 레지스트리 기능 플래그를 참조하십시오.
