工具科普系列(3) — GCP Cloud Run 建置 Azure DevOps CI/CD Pipelines agents 實例(二)

陳彥榮
MODA IT
Published in
6 min readDec 21, 2023
圖片來源:https://cloud.google.com/blog/topics/startups/google-cloud-container-tips-for-startups-and-tech-companies

之前我們為了能設立 IP 位址白名單,在 GCP Cloud Run services 以 container 自建 Azure Pipelines Self-hosted Linux agent,可參閱下列文章:

由於我們的 CI/CD pipelines 有建置 Docker images 需求,但 Cloud Run 為全代管服務,直接在 container 中安裝 Docker 套件並執行docker build指令時,會出現 container 權限不足,導致未成功建置 image 的問題。為解決此問題,我們在 Google Cloud Compute Engine 建置一台 VM,安裝 Docker 套件,增修 agent 和 VM 的參數或設定,使 CI/CD 流程中的docker build指令,能由 VM 的 Docker daemon 執行。

圖片來源:https://www.devteds.com/beginners-guide-to-docker/

首先我們建置一台作業系統為 Ubuntu 22.04 的 VM,按照 Docker 官網的步驟安裝 Docker 後,須新增 Docker daemon 的設定,再修改 Docker 的 systemd 服務:

  1. Docker daemon 預設只監聽本機的 Unix socket,為了能讓 agent 安裝的 Docker CLI 套件遠端連線到 VM 的 Docker daemon,我們須新增下列設定,使 Docker daemon 監聽 port 2375:
$ sudo systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket

$ sudo nano /etc/docker/daemon.json
{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}

2. 修改 Docker 的 systemd 服務,讓服務重啟後,會以新設定執行:

$ sudo nano /lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd --config-file /etc/docker/daemon.json
...

3. 重啟 Docker 服務:

$ sudo systemctl daemon-reload
$ sudo systemctl start docker

由於 agent 須安裝 Docker CLI 套件,我們修改 agent 的 Dockerfile,新增 Docker CLI 套件的下載和安裝指令:

FROM ubuntu:22.04

ENV AGENT_ALLOW_RUNASROOT="true"
ENV TARGETARCH="linux-x64"
ENV CLOUDSDK_CORE_DISABLE_PROMPTS="1"

RUN apt-get update && apt-get install -y curl git jq libicu70 sudo gnupg gettext-base netcat

# Install kubectl
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
chmod +x kubectl && \
mv kubectl /usr/local/bin/

# Install gcloud
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | \
tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
apt-get update && \
apt-get install -y google-cloud-cli && \
apt-get install -y google-cloud-sdk-gke-gcloud-auth-plugin

# Install Docker CLI
RUN curl -o docker-ce-cli.deb https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-cli_24.0.7-1~ubuntu.22.04~jammy_amd64.deb && \
dpkg -i docker-ce-cli.deb

RUN apt-get upgrade -y

COPY ./start.sh /
WORKDIR /azp/

ENTRYPOINT ["/start.sh"]
CMD ["--once"]

建置 agent 的 image 後,於 Cloud Run 執行前要再配置一組環境變數DOCKER_HOST,如下圖所示:

DOCKER_HOST 須設定為 tcp://<host IP>:2375,我們的 host IP 即為 VM 的內部 IP,讓 agent 能遠端連線到 VM,使用 VM 的 Docker daemon 執行 Docker 指令。

--

--