Docker에서 이미지의 강제 클린 빌드

Isaac Tony 2024년2월15일
  1. Docker에서 이미지 빌드
  2. --no-cache 옵션을 사용하여 Docker에서 이미지의 클린 빌드 강제 실행
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 파일을 만들 수 있습니다. 완료되면 파일 구조가 아래와 유사해야 합니다.

컨테이너화된 Docker 애플리케이션의 파일 구조

app.py 파일로 이동하여 애플리케이션을 생성할 수 있습니다. 응용 프로그램에는 아래와 같이 콘솔 메시지를 인쇄하는 간단한 기능이 포함되어 있습니다.

from flask import Flask

app = Flask(__name__)

def hello():

    print("Hello, this is a simple Flask application")

hello()

위의 코드를 실행할 때 예상되는 결과는 다음과 같습니다.

Flask 애플리케이션 실행 시 코드 결과

이제 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 내에서 이미지 빌드

그런 다음 아래와 같이 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
Isaac Tony avatar Isaac Tony avatar

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

관련 문장 - Docker Image