在 Docker 中強制乾淨構建映像

Isaac Tony 2023年1月30日 2022年4月20日
  1. 在 Docker 中構建映象
  2. 在 Docker 中使用 --no-cache 選項強制乾淨構建映像
在 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 建立一個 docker 檔案。為了讓我們更輕鬆地建立 docker 檔案,我們建立了一個 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。這些命令將在我們執行 docker 容器時執行。

在這種情況下,我們將使用 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

在 Docker 中使用 --no-cache 選項強制乾淨構建映像

使用這個映象構建了一個容器後,假設我們想使用同一個映象再次構建一個映象。在這種情況下,docker 守護程序將使用映象層的現有快取來構建映象。

但是,我們可以使用 --no-cache 選項強制在 Docker 中構建乾淨的映像。這會覆蓋 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

如下所示,我們已經成功構建了一個新容器並強制 Docker 使用 --no-cache 選項來乾淨構建映像。

$ 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
Author: 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