Docker에서 이미지의 강제 클린 빌드
이 자습서에서는 Docker에서 이미지의 클린 빌드를 강제 실행하는 방법을 논의하고 보여줍니다.
Docker에서 이미지 빌드
이 개념을 시연하기 위해 간단한 Flask 애플리케이션을 사용할 것입니다. 아래 명령을 사용하여 메인 폴더 my-app
내에 app.py
라는 간단한 응용 프로그램을 만듭니다.
touch app.py
명령을 사용하지 않은 경우 Python3을 설치합니다.
sudo apt update && sudo apt install python3-venv
명령을 사용하여 Flask와 Gunicorn을 설치할 수도 있습니다.
pip install flask gunicorn
touch Dockerfile
명령을 사용하여 도커 파일 생성을 진행합니다. 도커 파일을 더 쉽게 만들 수 있도록 requirements.txt
파일을 만듭니다.
pip freeze > requirements.txt
명령을 실행하여 requirements.txt
파일을 만들 수 있습니다. 완료되면 파일 구조가 아래와 유사해야 합니다.
app.py
파일로 이동하여 애플리케이션을 생성할 수 있습니다. 응용 프로그램에는 아래와 같이 콘솔 메시지를 인쇄하는 간단한 기능이 포함되어 있습니다.
from flask import Flask
app = Flask(__name__)
def hello():
print("Hello, this is a simple Flask application")
hello()
위의 코드를 실행할 때 예상되는 결과는 다음과 같습니다.
이제 Docker가 이미지를 빌드하는 데 사용할 명령으로 Dockerfile을 채웁니다. 이러한 명령은 도커 컨테이너를 실행할 때 실행됩니다.
이 경우 Python을 기본 이미지로 사용할 것입니다. Dockerfile은 다음과 같아야 합니다.
# base image
FROM python
# Set your working directory
WORKDIR /var/www/
# Copy the necessary files
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt
# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
# Run the app
CMD python3 app.py
Dockerfile이 준비되면 저장하고 테스트를 위해 로컬에서 이미지를 빌드할 수 있습니다. -t
태그와 함께 docker build
명령을 사용할 수 있습니다.
그런 다음 아래와 같이 docker run
명령을 사용하여 이미지를 테스트할 수 있습니다.
(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application
docker ps
명령을 사용하여 새 컨테이너를 성공적으로 빌드했는지 확인합니다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd10c9a6a8a1 myapp "/bin/sh -c 'python3…" 11 minutes ago Exited (0) 10 minutes ago vigilant_brattain
--no-cache
옵션을 사용하여 Docker에서 이미지의 클린 빌드 강제 실행
이 이미지를 사용하여 컨테이너를 빌드한 후 동일한 이미지를 사용하여 이미지를 다시 빌드하려고 한다고 가정합니다. 이 경우 도커 데몬은 이미지 레이어의 기존 캐시를 사용하여 이미지를 빌드합니다.
그러나 --no-cache
옵션을 사용하여 Docker에서 깨끗한 이미지 빌드를 강제할 수 있습니다. 이것은 도커 데몬 기본 동작을 재정의합니다.
이를 구현하는 방법은 다음과 같습니다.
myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker build --no-cache -t myapp .
[+] Building 119.0s (10/10) FINISHED
=> [internal] load .dockerignore 1.6s
=> => transferring context: 2B 0.4s
=> [internal] load build definition from Dockerfile 2.1s
=> => transferring dockerfile: 38B 0.4s
=> [internal] load metadata for docker.io/library/python:latest 37.9s
=> [1/5] FROM docker.io/library/python@sha256:ee0b617025e112b6ad7a4c76758e4a02f1c429e1b6c44410d95b024304698ff2 0.1s
=> [internal] load build context 0.4s
=> => transferring context: 63B 0.0s
=> CACHED [2/5] WORKDIR /var/www/ 0.1s
=> [3/5] COPY ./app.py /var/www/app.py 1.3s
=> [4/5] COPY ./requirements.txt /var/www/requirements.txt 2.2s
=> [5/5] RUN pip install -r /var/www/requirements.txt 68.4s
=> exporting to image 4.8s
=> => exporting layers 3.8s
=> => writing image sha256:ee771b73a9ec468308375d139a35580f6c7f62988db9c0bb0b85794716406e92 0.1s
=> => naming to docker.io/library/myapp
docker run
명령을 사용하여 새 컨테이너를 만들 수 있습니다.
(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application
아래에서 볼 수 있듯이 --no-cache
옵션을 사용하여 이미지를 새로 빌드하고 Docker를 강제로 성공적으로 빌드했습니다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
826b8de2c92f myapp "/bin/sh -c 'python3…" 47 seconds ago Exited (0) 39 seconds ago kind_pike
dd10c9a6a8a1 ba84c5d3b157 "/bin/sh -c 'python3…" 28 minutes ago Exited (0) 28 minutes ago vigilant_brattain
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn