Open6

docker build 時のシークレット運用のポイントとGPU付きセルフホステッドランナーコンテナのビルド

PINTOPINTO
  • docker build 時に --secret id=GITHUB_ACCESS_TOKEN_key,env=GITHUB_ACCESS_TOKEN のような指定でホストPCの環境変数をdocker内のシークレットとして引き渡すことができる
  • docker build 時に -secret id=GITHUB_ACCESS_TOKEN_key,src=/path/to/secretA のような指定でホストPC上の任意の場所に保存してある読み取り専用のシークレット情報記載済みファイルをdocker内のシークレットとして引き渡すことができる
  • シークレットファイルとして引き渡す場合は、ファイルの権限設定を sudo chmod 0444 xxxx として読み取り専用の属性にセットしておく必要が有る
  • --secretenv= に指定する 環境変数export 文でセットされている必要が有る
  • --secret id=xxxxxx の部分は、Dockerfile 内の --mount=type=secret,id=xxx のidの部分に対応付く
  • id=xxx の部分に指定された xxx/run/secrets/xxx ファイルとして docker 内部に生成される
  • /run/secrets/xxx から読み出したシークレット情報を変数などにセットしなおしてから echo $xxxcat /run/secrets/xxx を実行してしまうと変数の中身が全て見えてしまうので注意
  • --progress plain を指定するといつもの docker build のログ形式で表示されるが、指定しない場合は buildkit 特有のオシャレなログ表示形式で表示される(ログが縦に無限に伸びない)
  • ホストPC側で環境変数を生成するときに export 文を使用していない場合、docker build の中で /run/secrets/ にシークレットファイルが生成されない(シークレットファイルの生成に失敗する)
  • --ephemeral を指定してセルフホステッドランナーの config.sh を実行すると、ジョブ実行1回終了後にワークフローが削除される。これは、成功・失敗によらず1回で消される。
  • Personal Access Token (PAT)repo のチェックを入れて生成したものを使用する(それ以外のチェックオンは不要)
    • NG

      GITHUB_ACCESS_TOKEN=${PAT}
      GITHUB_REPOSITORY_OWNER=${OWNER}
      GITHUB_REPOSITORY_NAME=${NAME}
      GITHUB_DOMAIN=github.com
      GITHUB_API_DOMAIN=api.github.com
      
    • OK

      export GITHUB_ACCESS_TOKEN=${PAT}
      export GITHUB_REPOSITORY_OWNER=${OWNER}
      export GITHUB_REPOSITORY_NAME=${NAME}
      export GITHUB_DOMAIN=github.com
      export GITHUB_API_DOMAIN=api.github.com
      
PINTOPINTO
  • セルフホステッドランナーコンテナのビルド
Dockerfile.runner_x64
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ARG RUNNERUSER=hostedrunner

SHELL ["/bin/bash", "-c"]


# CUDA Install
COPY packages/cuda/cuda11.8_cudnn8.9/* .

RUN apt-get update \
    && apt-get install -y wget zlib1g \
    # CUDA
    && mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
    && dpkg -i cuda-repo-ubuntu2204-11-8-local_11.8.0-520.61.05-1_amd64.deb \
    && cp /var/cuda-repo-ubuntu2204-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/ \
    && apt-get update \
    && apt-get -y install cuda \
    && rm cuda-repo-ubuntu2204-11-8-local_11.8.0-520.61.05-1_amd64.deb \
    # cuDNN
    && dpkg -i cudnn-local-repo-ubuntu2204-8.9.0.131_1.0-1_amd64.deb \
    && cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/ \
    && apt-get update \
    && apt-get install libcudnn8=8.9.0.131-1+cuda11.8 \
    && apt-get install libcudnn8-dev=8.9.0.131-1+cuda11.8 \
    && rm cudnn-local-repo-ubuntu2204-8.9.0.131_1.0-1_amd64.deb \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*


# Install dependency
RUN mkdir /actions_runner
COPY ./activate.sh /actions_runner

RUN apt-get update \
    && apt-get install -y \
        curl \
        sudo \
        tree \
        coreutils \
        ca-certificates \
        curl \
        gnupg \
        jq \
    && install -m 0755 -d /etc/apt/keyrings \
    && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg \
    && sudo chmod a+r /etc/apt/keyrings/docker.gpg \
    && echo \
        "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
        "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
        tee /etc/apt/sources.list.d/docker.list > /dev/null \
    && apt-get update \
    && apt-get install -y \
        docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /actions_runner

# Install Self-Hosted runnner
RUN curl \
        -o actions-runner-linux-x64-2.304.0.tar.gz \
        -L https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz \
    && echo "292e8770bdeafca135c2c06cd5426f9dda49a775568f45fcc25cc2b576afc12f  actions-runner-linux-x64-2.304.0.tar.gz" | shasum -a 256 -c \
    && tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz \
    && rm actions-runner-linux-x64-2.304.0.tar.gz \
    && ./bin/installdependencies.sh \
    && useradd ${RUNNERUSER} -m \
    && echo "${RUNNERUSER} ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/${RUNNERUSER} \
    && chown ${RUNNERUSER}:${RUNNERUSER} . -R \
    && addgroup dockremap \
    && useradd -g dockremap dockremap \
    && echo 'dockremap:165536:65536' >> /etc/subuid \
    && echo 'dockremap:165536:65536' >> /etc/subgid \
    && mkdir -p /home/${RUNNERUSER}/.docker \
    && chown -R ${RUNNERUSER} /home/${RUNNERUSER}/.docker \
    && usermod -aG sudo ${RUNNERUSER} \
    && usermod -aG docker ${RUNNERUSER}

# Configure Self-Hosted runnner
RUN --mount=type=secret,id=GITHUB_ACCESS_TOKEN_key,required \
    --mount=type=secret,id=GITHUB_REPOSITORY_OWNER_key,required \
    --mount=type=secret,id=GITHUB_REPOSITORY_NAME_key,required \
    --mount=type=secret,id=GITHUB_DOMAIN_key,required \
    --mount=type=secret,id=GITHUB_API_DOMAIN_key,required \
    export GITHUB_ACCESS_TOKEN=$(cat /run/secrets/GITHUB_ACCESS_TOKEN_key) \
    && export GITHUB_REPOSITORY_OWNER=$(cat /run/secrets/GITHUB_REPOSITORY_OWNER_key) \
    && export GITHUB_REPOSITORY_NAME=$(cat /run/secrets/GITHUB_REPOSITORY_NAME_key) \
    && export GITHUB_DOMAIN=$(cat /run/secrets/GITHUB_DOMAIN_key) \
    && export GITHUB_API_DOMAIN=$(cat /run/secrets/GITHUB_API_DOMAIN_key) \
    && export GITHUB_RUNNER_REGISTRATION_TOKEN=$(curl \
            -X POST \
            -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${GITHUB_ACCESS_TOKEN}" \
            -H "X-GitHub-Api-Version: 2022-11-28" \
            https://${GITHUB_API_DOMAIN}/repos/${GITHUB_REPOSITORY_OWNER}/${GITHUB_REPOSITORY_NAME}/actions/runners/registration-token \
        | jq .token | sed -e 's/"//g') \
    && sudo -u ${RUNNERUSER} ./config.sh \
        --url https://${GITHUB_DOMAIN}/${GITHUB_REPOSITORY_OWNER}/${GITHUB_REPOSITORY_NAME} \
        --token ${GITHUB_RUNNER_REGISTRATION_TOKEN} \
        --unattended \
        --replace \
        --name base-image-build-runner

# User change
USER ${RUNNERUSER}

# Environment variables at startup
RUN echo 'export USER=`whoami`' >> ~/.bashrc \
    && echo 'export PATH=/usr/local/cuda/bin:${PATH}' >> ~/.bashrc \
    && echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc \
    && echo 'export PATH=${PATH}:${HOME}/.local/bin' >> ~/.bashrc

# Run Self-Hosted runnner
CMD [ "./activate.sh" ]
activate.sh
#!/bin/bash

echo USER: `whoami`
export PATH=/usr/local/cuda/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}
sudo chgrp docker /var/run/docker.sock
nvidia-smi
nvcc --version
tree base/packages
./run.sh
.dockerignore
.git
.github
.dockerignore
.gitignore
Dockerfile*
README*
PINTOPINTO
DOCKER_BUILDKIT=1 \
docker build \
--no-cache \
--progress plain \
--secret id=GITHUB_ACCESS_TOKEN_key,env=GITHUB_ACCESS_TOKEN \
--secret id=GITHUB_REPOSITORY_OWNER_key,env=GITHUB_REPOSITORY_OWNER \
--secret id=GITHUB_REPOSITORY_NAME_key,env=GITHUB_REPOSITORY_NAME \
--secret id=GITHUB_DOMAIN_key,env=GITHUB_DOMAIN \
--secret id=GITHUB_API_DOMAIN_key,env=GITHUB_API_DOMAIN \
-t ghcr.io/pinto0309/self_hosted_runner \
-f Dockerfile.runner_x64 .
PINTOPINTO
  • GPU付きセルフホステッドランナーコンテナの実行
docker run --rm -it \
--gpus all \
-v `pwd`:/actions_runner/base \
-v /var/run/docker.sock:/var/run/docker.sock \
--net host \
--privileged \
ghcr.io/pinto0309/self_hosted_runner
USER: hostedrunner
Mon May 29 13:17:43 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   45C    P8    13W / 220W |    702MiB /  8192MiB |      6%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
base/packages
`-- cuda
    `-- cuda11.8_cudnn8.9
        |-- cuda-repo-ubuntu2204-11-8-local_11.8.0-520.61.05-1_amd64.deb
        |-- cuda-ubuntu2204.pin
        `-- cudnn-local-repo-ubuntu2204-8.9.0.131_1.0-1_amd64.deb

2 directories, 3 files

√ Connected to GitHub

Current runner version: '2.304.0'
2023-05-29 13:17:46Z: Listening for Jobs