Open6
docker build 時のシークレット運用のポイントとGPU付きセルフホステッドランナーコンテナのビルド
-
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
として読み取り専用の属性にセットしておく必要が有る -
--secret
のenv=
に指定する環境変数
はexport
文でセットされている必要が有る -
--secret id=xxx
のxxx
の部分は、Dockerfile 内の--mount=type=secret,id=xxx
のidの部分に対応付く -
id=xxx
の部分に指定されたxxx
が/run/secrets/xxx
ファイルとして docker 内部に生成される -
/run/secrets/xxx
から読み出したシークレット情報を変数などにセットしなおしてからecho $xxx
やcat /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
-
- セルフホステッドランナーコンテナのビルド
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 \
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*
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 .
-
Settings
-Actions
-Runners
- 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