목적

  1. 다른 운영체제의 패키지를 관리하는 방법 모색
    1. macOS에서 RHEL 의 패키지를 관리하는 방법
  2. 오프라인 개발 환경에서 필요한 RHEL OS의 패키지를 설치하고 테스트하는 목적

상세설명

Docker를 이용해 외부에서 OS와 아키텍처에 따른 패키지 설치파일을 관리하는 방법

  1. 필요한 OS를 사전에 다운로드 진행

    # OS 이미지 다운로드 
    ## --plafform: linux/amd64로 사용할 예정
    docker pull --platform ${PLATFORM} redhat/ubi9:9.4
    
  2. Docker를 통해 필요한 패키지를 로컬 다운로드

    # 파일명: Dockerfile.dependency
    
    # 사전에 설치해둔 이미지로 로드됨
    FROM redhat/ubi9:9.4
    
    # 작업 디렉토리 설정
    WORKDIR /app
    COPY . /app
    
    # utils 설치
    RUN dnf install -y dnf-utils
    
    # nginx 관련 패키지 다운로드
    ## 컨테이너 실행 시 명령어 자동 실행
    CMD repotrack -p /app/rpms nginx && sleep infinity
    
  3. 패키지 설치를 위한 Image build

    # 이미지 빌드
    ## --plafform: linux/amd64로 사용할 예정
    ## -f: Dockerfile 경로
    ## -t: 이미지 명
    ## ex) docker buildx build --platform linux/amd64 -f Dockerfile.dependency -t daegu_marathon .
    docker buildx build --platform ${PLATFORM} -f ${DOCKFILE} -t ${IMAGE_NAME} .
    
  4. Docker 컨테이너 실행

    # 컨테이너 실행
    ## --plafform: linux/amd64로 사용할 예정
    ## -v: 컨테이너와 호스트 시스템 간에 마운트
    ## ex) docker run -v $(pwd)/rpms:/app/rpms --platform linux/amd64 b984584808ab
    docker run -v ${HOST_PATH}:${CONTAINER_PATH} --platform ${PLATFORM} ${IMAGE_ID}
    

위 과정을 통해 HOST_PATH에 rpm패키지를 받을 수 있음.

로컬패키지를 통해 설치를 모의

  1. 위 과정을 통해 받은 패키지를 설치하고 nginx를 구동하는 이미지 생성

    # 파일명: Dockerfile
    
    FROM redhat/ubi9:9.4
    
    # 작업 디렉토리 설정
    WORKDIR /app
    COPY . /app
    
    # Node.js 설치
    ## NodeSource Node.js 20.x 리포지토리 추가
    # RUN curl -fsSL <https://rpm.nodesource.com/setup_22.x> | bash -
    ## Node.js 설치
    # RUN yum install -y nodejs-22.12.0
    
    # corepack 활성화
    # RUN corepack enable
    ## corepack 오프라인 워크플로
    # RUN corepack install -g --cache-only ./packageManager/corepack.tgz
    
    # 프론트 앱 설치 및 빌드
    ## 패키지 설치
    # RUN yarn install --immutable
    ## App 빌드
    # RUN yarn build
    
    # 오프라인 설치
    RUN dnf localinstall -y rpms/*.rpm --disablerepo=* --skip-broken
    RUN nginx -h
    
    # Nginx 설정 파일 복사
    # COPY nginx/nginx.conf /etc/nginx/nginx.conf
    
    # Nginx 포트 노출
    # EXPOSE 80
    
    # Nginx 시작
    CMD ["nginx", "-g", "daemon off;"]
    
    # 이미지 빌드
    ## --plafform: linux/amd64로 사용할 예정
    ## -f: Dockerfile 경로
    ## -t: 이미지 명
    ## ex) docker buildx build --platform linux/amd64 -f Dockerfile -t daegu_marathon_runner .
    docker buildx build --platform ${PLATFORM} -f ${DOCKFILE} -t ${IMAGE_NAME} .
    
  2. Docker 컨테이너를 실행하여 확인


# 컨테이너 실행
## --plafform: linux/amd64로 사용할 예정
## -d: 백그라운드로 실행
## --privileged: 시스템 리소스나 디바이스 접근이 필요할 때만 사용
## ex) docker run -d --platform linux/amd64 --privileged 8d0be310885c /sbin/init
docker run -d --platform ${PLATFORM} --privileged ${IMAEGE_ID} /sbin/init

관련자료

Multi-arch 환경에서 개발 가이드 생성

Multi-arch 환경에서 개발 가이드 생성 [2]