도커 이미지 만들기

SeHun.J·2024년 1월 2일

디스코드봇 도커 도입

간단하게 개발 중인 디스코드봇을 Github Actions를 활용하여 자동배포를 구현하는 과정에서 SSH 명령어로 직접 python을 실행하기보단 docker를 통해 실행하는게 편하다고 생각되었다.

python으로 직접 실행하면 업데이트가 있을 때 기존에 실행되던 python procees를 kill한 후, 다시 실행하는 절차를 거쳐야하고 원격서버에 설치된 환경을 의존하기 때문에 docker image로 가상환경을 구축해서 실행하는게 좋다고 판단함.

Dockerfile 작성

CI/CD를 통해 깃허브 레포에 있는 모든 파일을 원격서버에 SCP로 옮긴 후 원격서버에서 docker image를 빌드하는 방식으로 사용하고 있었는데, 베이스이미지로 사용중인 Python3.10에는 ffmpeg가 설치되지 않은 상태였다.

그래서 아래와 같이 Dockerfile을 구성했었다.

FROM python:3.10

RUN apt-get update && \
    apt-get install -y ffmpeg

WORKDIR .

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

하지만 이렇게 했을 때 다음과 같은 단점이 있었는데,

해당 Dockerfile을 이용한 빌드이미지가 어떤 연유로 삭제된 경우 리빌드할 때 ffmpeg를 다시 설치하는 과정을 기다려야 함.

그래서 아예 python 3.10 환경에 ffmpeg가 설치된 베이스이미지를 직접 만들기로 결정했다.

나만의 베이스이미지 생성

먼저 베이스이미지를 만들기 위해, 새롭게 Dockerfile을 작성했다.

FROM python:3.10

RUN apt-get update && \
    apt-get install -y ffmpeg && \
	apt-get install -y tzdata

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

아 참고로, tzdata도 설치하는 이유는 해당 이미지의 Timezone을 Asia/Seoul로 설정한 상태로 배포하기 위해서이다. 위의 Dockerfile을 아래의 명령어로 빌드했다.

docker build -t westreed/python3.10-ffmpeg:latest .

빌드이미지 이름을 계정이름/빌드이미지:latest형태로 작성했는데 그 이유는 DockerHub에 베이스 이미지를 업로드해서 편하게 가져다 쓰기 위해서 그랬다. 이미지를 허브에 push하기 위해선 먼저 로그인이 필요해서 docker login 절차를 진행했다.

로그인까지 진행했다면, 이제 push할 차례다.

docker push westreed/python3.10-ffmpeg:latest

이렇게 하면, DockerHub의 계정에 생성한 베이스이미지가 업로드되었음을 확인할 수 있다.
DockerHub

만든 베이스이미지를 기반으로 Dockerfile 작성

이제 Python3.10에 ffmpeg가 설치된 베이스이미지가 있으므로, 디스코드봇을 실행할 Dockerfile의 베이스이미지를 다시 작성한다.

FROM westreed/python3.10-ffmpeg

WORKDIR .

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

아까와 다른 점은 베이스이미지가 FROM python:3.10에서 FROM westreed/python3.10-ffmpeg로 바뀌었고, ffmpeg를 설치하는 RUN 명령어도 삭제했다.

profile
취직 준비중인 개발자

0개의 댓글