본문 바로가기
Docker & Kubernetes

Docker 이미지 업데이트 자동화: Shell Script와 Docker Compose 활용

by 떡쇠 2024. 8. 25.
반응형
반응형

Docker 컨테이너를 사용하다 보면, 새로운 라이브러리를 추가하거나 설정을 변경하는 등의 작업이 이루어질 수 있다.

이러한 변화는 컨테이너가 실행 중일 때는 반영되지만 컨테이너를 재기동하거나 삭제 후 다시 시작할 경우 변동사항이 사라질 위험이 있다.

변동사항을 포함한 새로운 Docker 이미지를 생성하여, 언제든지 동일한 상태로 컨테이너를 재구성할 수 있도록 하는 것이 중요하다.

 

이 글에서는 Shell Script를 활용해 Docker 컨테이너에서 변동사항을 포함한 이미지를 자동으로 생성하고 관리하는 방법을 소개한다. 이 과정을 통해 컨테이너의 상태를 안정적으로 유지하고 재기동 시에도 변동사항이 반영된 이미지를 사용할 수 있게 된다.


이미 생성된 컨테이너를 사용한 이미지 업데이트 자동화

이 방법은 이미 실행 중인 컨테이너의 현재 상태를 기반으로 새로운 Docker 이미지를 생성한다. 이 방식은 컨테이너 내에서 발생한 모든 변경 사항을 그대로 반영할 수 있다.

 

절차

  1. 컨테이너의 상태 확인: 이미지로 빌드할 실행중인 컨테이너의 필요한 변경 사항이 적용된 상태인지 확인한다.
  2. Shell Script 작성 및 실행: 변경된 컨테이터를 이미지로 커밋하는 Shell Script를 작성하고 실행한다.

shell script 예시

# docker-commit.sh
#########################
# 컨테이너 ID 목록을 배열로 정의
containers=("container1" "container2" "container3") # 컨테이너 이름

# 각 컨테이너를 이미지로 커밋하여 저장
for container in "${containers[@]}"; do
  docker commit "$container" "${container}_image:latest"
done

#######################
# 파일 저장 후 명령어 실행
./docker-commit.sh

 

이렇게 작성한 shell script를 실행하게 되면, containers 배열에 정의한 컨테이너의 모든 변경 사항(설치된 패키지, 설정 변경 등)이 반영된 이미지를 빌드할 수 있다.

 

장점:

  • 변경 사항 반영: 실행 중인 컨테이너에서 발생한 모든 변경 사항(설치된 패키지, 설정 변경 등)을 이미지에 반영할 수 있다.
  • 즉각적인 적용: 개발 중에 컨테이너 내에서 적용한 변경 사항을 빠르게 이미지로 저장할 수 있다.

 

단점은 컨테이너 내부에서 수동으로 변경사항을 적용을 해야하므로 완전한 자동화는 아니다.


Dockerfile을 사용한 이미지 업데이트 자동화

이 방법은 Dockerfile을 사용하여 이미지 빌드 과정을 코드로 관리하고, 이를 자동화하여 최신 이미지를 생성한다. 모든 변경 사항(설치된 패키지, 설정 등)은 Dockerfile에 명시적으로 기록된다.

 

절차

  1. Dockerfile 작성: 애플리케이션의 설정, 설치해야 할 패키지, 실행 명령어 등을 정의한 Dockerfile을 작성한다.
  2. 이미지 빌드: Dockerfile을 기반으로 새로운 이미지를 빌드하여 최신 상태를 반영한다.
# (예시는 airflow, 각자 환경에 맞게 수정)

FROM apache/airflow:2.6.1

# 환경 변수 설정 
ENV AIRFLOW__CORE__EXECUTOR=LocalExecutor
ENV AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
ENV AIRFLOW__CORE__FERNET_KEY=your-fernet-key
ENV AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=True
ENV AIRFLOW__CORE__LOAD_EXAMPLES=False

# /etc/pip.conf 파일 생성 및 설정 추가
RUN echo "[global]\n\
trusted-host = pypi.python.org\n\
index-url = https://pypi.org/simple\n\
" > /etc/pip.conf

# 필요한 라이브러리 설치
COPY requirements.txt /requirements.txt # requirements.txt 별도 파일에 필요한 라이브러리 작성
RUN pip install -r /requirements.txt

# 컨테이너 실행 시 시작할 명령어
CMD ["airflow", "webserver"]


#################################
#requiements.txt 파일 예시
requests==2.25.1
numpy>=1.19.5
pandas==1.2.3

장점

  • 재현성: Dockerfile에 명시된 대로 이미지를 빌드하기 때문에, 동일한 이미지를 언제든지 재현할 수 있다.
  • 버전 관리: Dockerfile을 버전 관리 시스템(Git 등)으로 관리하여, 변경 내역을 추적하고 협업할 수 있다.
  • 자동화 용이: CI/CD 파이프라인에 쉽게 통합하여, 자동으로 이미지를 빌드하고 배포할 수 있다.

단점:

  • 변경 사항 즉각 반영 어려움: 컨테이너에서 발생한 일시적인 변경 사항을 반영하려면, Dockerfile을 수정해야 하므로 시간이 걸릴 수 있다.
  • Dockerfile 관리 필요: 변경 사항이 발생할 때마다 Dockerfile을 수정하고 관리해야 한다.
반응형