간단하게 개발 중인 디스코드봇을 Github Actions
를 활용하여 자동배포를 구현하는 과정에서 SSH 명령어로 직접 python을 실행하기보단 docker
를 통해 실행하는게 편하다고 생각되었다.
python으로 직접 실행하면 업데이트가 있을 때 기존에 실행되던 python procees를 kill한 후, 다시 실행하는 절차를 거쳐야하고 원격서버에 설치된 환경을 의존하기 때문에 docker image로 가상환경을 구축해서 실행하는게 좋다고 판단함.
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의 계정에 생성한 베이스이미지가 업로드되었음을 확인할 수 있다.
이제 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 명령어도 삭제했다.