사전 구성된 NXRM(Nexus Repository Manager) Docker 컨테이너

9313 단어 proxycachedockernexus
요약: 프로젝트 @ 링크GitHub - unfor19/nexus-ops

최근에 치는 것을 피하는 방법을 찾아봤습니다DockerHub rate limits . 내가 생각한 솔루션 중 하나는 CI/CD 환경의 일부로 Nexus Repository Manager OSS(NXRM)을 배포하는 것이었으므로 CI/CD 러너는 공개 Docker 이미지를 가져오려고 할 때 DockerHub 대신 NXRM을 적중했습니다.

늘 그렇듯이 저는 NXRM을 시작하는 방법에 대해 Google에서 많이 검색했으며 로컬에서 실행하고 어떻게 진행되는지 확인하는 것이 최선인 것 같았습니다.

신사숙녀 여러분, 미리 구성된 NXRM Docker 컨테이너를 프로비저닝한 실제 경험을 알려드리겠습니다.

목표



DockerHubAWS ECR Public Gallery 으로 사전 구성된 NXRM Docker 컨테이너. Google에서 찾은 내용은 다음과 같습니다.
  • Automated Setup of Sonatype Nexus Repository Manager
  • NXRM Integration API Scripting Examples
  • Nexus Community - Automated provisioning of nexus

  • 기존 솔루션의 내 문제



    NXRM이 준비되고 NXRM 시작의 일부가 되는 즉시 init-script를 실행하고 싶습니다. 내 컴퓨터에서 스크립트를 수동으로 실행하고 싶지 않습니다. 모든 것은 NXRM 시작 프로세스의 일부로 수행되어야 합니다. 대부분의 기존 솔루션은 NXRM과 통신할 시스템에서 무언가를 실행하는 것을 설명합니다. 나는 다른 것을 찾고 있습니다.

    요망되는 결과



    원하는 출력을 설명하는 몇 가지 글머리 기호로 나누겠습니다.
  • init-script는 읽기 쉽고 유지 관리가 쉽습니다.
  • NXRM 컨테이너를 다시 시작하면 멱등적이어야 합니다. init-script는 기존 리소스를 만들려고 시도해서는 안 됩니다.
  • init-scriptBash과 같이 널리 사용되는 스크립팅 언어로 작성해야 합니다(그래서 Bash를 선택했습니다).
  • 더 많은 기능을 쉽게 추가하려면 NXRM REST API 을 사용하여 자동화된 작업을 수행해야 합니다. Bash를 선택했기 때문에 curl을 사용하여 HTTP 요청을 합니다.

  • Init 스크립트 설계



    원하는 결과는 분명합니다. 이제 NXRM 컨테이너를 시작할 때 init-script가 수행할 작업을 선언해야 합니다. 작업 목록은 다음과 같습니다(순서대로).
  • /nexus-data/admin.password에 있는 initial random passwordadmin로 변경합니다.
  • 활성화anonymous access - 익명 사용자가 localhost:8081 권한
  • 으로 액세스READ할 수 있습니다.
  • 추가Docker Bearer Token Realm - 로컬 Nexus 레지스트리에서 익명으로 가져오기 허용localhost:8081
  • proxy 유형의 Docker 저장소 두 개를 생성합니다.
  • docker-hub - 도커허브
  • docker-ecrpublic - AWS ECR 공개

  • 유형의 Docker 리포지토리를 생성합니다group.
  • docker-group - 위의 Docker 리포지토리는 이 Docker 그룹의 구성원입니다
  • .


    커스텀 도커 이미지 생성



    NXRM official Docker image 을 기반으로 Docker 이미지를 만들었습니다.

    Dockerfile은 다음과 같습니다.

    
    ARG NEXUS_VERSION="3.30.1"
    
    FROM sonatype/nexus3:${NEXUS_VERSION} as app
    USER root
    RUN curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && \
        chmod +x /usr/local/bin/jq
    
    USER nexus
    ENV NEXUS_DATA_PATH="/nexus-data" \
        NEXUS_ADMIN_USERNAME="admin" \
        NEXUS_ADMIN_PASSWORD="admin" \
        NEXUS_API_PATH="service/rest/v1" \
        NEXUS_BASE_PATH="http://localhost:8081" \
        NEXUS_OPS_VERBOSE="false"
    WORKDIR /"${NEXUS_DATA_PATH}/nexus-ops/"
    COPY provision/ .
    CMD /nexus-data/nexus-ops/entrypoint.sh
    


    Note: I added jq to the mix because I intend to use more APIs, and I'll need to analyze some JSON data. I find it best to analyze JSON data with jq when using Bash.



    위의 Dockerfile에서 볼 수 있듯이 provision/ 디렉토리를 NXRM 이미지에 복사하고 /opt/sonatype/start-nexus-repository-manager.shCMD로 실행하는 대신 provision/entrypoint.sh 스크립트로 래핑했습니다.

    결론적으로 전체 논리는 entrypoint.sh이라는 init-script에서 유지됩니다.
    main 함수는 다음과 같습니다.

    main(){
        start_nexus
        set_global_variables
        wait_for_healthy_response
        set_credentials
        change_initial_password
        enable_anonymous_access
        realms_enable_docker_token
        repositories_create_repository_wrapper "proxy" "docker-hub" "${_NEXUS_OPS_PATH}/repositories/docker-proxy-dockerhub.json"
        repositories_create_repository_wrapper "proxy" "docker-ecrpublic" "${_NEXUS_OPS_PATH}/repositories/docker-proxy-ecrpublic.json"
        repositories_create_repository_wrapper "group" "docker-group" "${_NEXUS_OPS_PATH}/repositories/docker-group.json"
        log_msg "Finished executing - ${_NEXUS_OPS_PATH}/entrypoint.sh"
    }
    


    최종 결과



    여기 내 프로젝트 @ GitHub - unfor19/nexus-ops가 있습니다. 작동 방식을 이해하려면 provision/entrypoint.sh 파일을 확인하십시오. 최대한 깔끔하게 만들려고 노력했습니다.

    하나 더; 내 프로젝트에서 디렉토리provision/repositories를 찾을 수 있습니다. 해당 디렉터리에는 프로비저닝된 리포지토리의 JSON 구조가 포함되어 있습니다. 예를 들어 DockerHub repository을 생성하는 명령은 다음과 같습니다.

    repositories_create_repository_wrapper "proxy" "docker-hub" "${_NEXUS_OPS_PATH}/repositories/docker-proxy-dockerhub.json"
    


    마지막 단어



    처음에 저는 NXRM에 약간 겁을 먹었습니다. NXRM을 통해 Docker 요청을 프록시하는 것은 복잡해 보였습니다. 하지만 이 프로젝트를 만들고 나서 아이디어를 얻은 것 같고 여러분도 그랬기를 바랍니다.

    좋은 웹페이지 즐겨찾기