Docker Build 指定 Commit 版本

滿多人在設計程式並沒有版本概念,因此要把程式包裝成 Docker 要指定舊版就會變得不太方便,所以在這邊寫了一個特別的 Dockerfile 來處理這個問題。

使用 Dockerfile 指定 Commit 版本

此範例使用 Docker Ubuntu 20.04 作為範例,安裝 Git 後使用 Git 指令變更程式

FROM ubuntu:20.04
LABEL maintainer="Clarence Lin <[email protected]>"

RUN apt update
RUN apt install -y git

ARG GIT_REPO
ENV GIT_REPO $GIT_REPO

ARG GIT_FOLDER
ENV GIT_FOLDER $GIT_FOLDER

ARG GIT_URL
ENV GIT_URL $GIT_URL

ARG SOURCE_BRANCH
ENV SOURCE_BRANCH $SOURCE_BRANCH

ARG SOURCE_COMMIT
ENV SOURCE_COMMIT $SOURCE_COMMIT

RUN git clone $GIT_URL $GIT_FOLDER \
      && cd $GIT_FOLDER \
      && git checkout $SOURCE_BRANCH \
      && git reset --hard $SOURCE_COMMIT

Build Docker 腳本

主要需要修改的為腳本上方定義的變數,DOCKER 開頭的代表編譯 Docker 會使用到的參數,而這邊最需要注意的是 SOURCE_BRANCH,現在很多 Repo 使用的預設 Branch 可能是 main 而不是 master,而 SOURCE_COMMIT 可以直接使用 SHA 來讓 Git 直接跳到指定的 Commit 位置,如果不指定 SHA 位置就把上方的指令解除註解不然會錯誤。

DOCKER_REPO="clarencetw/projen-cdk-ec2-web"
DOCKER_TAG="latest"
GIT_REPO="clarencetw/projen-cdk-ec2-web"
GIT_FOLDER="projen-cdk-ec2-web"
GIT_URL="https://github.com/${GIT_REPO}.git"
SOURCE_BRANCH="main"
# SOURCE_COMMIT=`git ls-remote ${GIT_URL} ${SOURCE_BRANCH} | awk '{ print $1 }'`
SOURCE_COMMIT="4f4502403c2c17253ffda1f9c750e4455a24fdb7"

echo DOCKER_REPO: $DOCKER_REPO
echo DOCKER_TAG: $DOCKER_TAG
echo GIT_REPO: $GIT_REPO
echo GIT_FOLDER: $GIT_FOLDER
echo GIT_URL: $GIT_URL
echo SOURCE_BRANCH: $SOURCE_BRANCH
echo SOURCE_COMMIT: $SOURCE_COMMIT

echo "building repo: ${GIT_REPO}"
docker build \
    --build-arg GIT_REPO=$GIT_REPO \
    --build-arg GIT_FOLDER=$GIT_FOLDER \
    --build-arg GIT_URL=$GIT_URL \
    --build-arg SOURCE_BRANCH=$SOURCE_BRANCH \
    --build-arg SOURCE_COMMIT=$SOURCE_COMMIT \
    -t $DOCKER_REPO:$DOCKER_TAG .