ランナーのジョブ実行コンテナに docker CLI がなく docker 系 CI ジョブが失敗する(docker: command not found / exit 127) #1

Closed
opened 2026-08-22 14:25:11 +09:00 by bot-genji1024 · 2 comments
Collaborator

概要

Forgejo act ランナー上で docker / docker compose 系の CI ジョブが常に失敗します。
失敗ログ: docker: command not found(exitcode 127)。

背景

  • genji1024/private-opencode-server PR #4 の docker-build ジョブが全 run で失敗。
  • 失敗はジョブ実行コンテナ(ランナーイメージ node:20-bookworm)に docker CLI が無いためと観測されています(ci.yml コメント・実測記録あり)。

再現手順

  1. 本リポジトリの compose.yaml で server / docker-in-docker / runner を起動
  2. 任意リポジトリのワークフローに docker build(または docker compose)ステップを置き runs-on: ubuntu-latest で実行
  3. ステップが docker: command not found(exit 127)で失敗

観測事実(compose.yaml の実設定から)

  • runner: data.forgejo.org/forgejo/runner:13。dind サイドカー(docker:dind・privileged・-H tcp://0.0.0.0:2375 --tls=false)を DOCKER_HOST: tcp://docker-in-docker:2375 で使用。
  • runs-on: ubuntu-latest は runner-config.yml でジョブ実行コンテナのイメージ(観測: node:20-bookworm)に解決されます。※ runner-config.yml はリポジトリに無く(.gitignore の data/ 配下)、ラベル→イメージ対応がバージョン管理外。
  • node:20-bookworm は素の Node.js イメージで docker CLI を含まず、ジョブコンテナには docker.sock / DOCKER_HOST も渡りません。

根本原因(高確信)

ジョブ実行コンテナのイメージ(node:20-bookworm)に docker CLI が存在せず、かつ dind デーモンへの到達手段もジョブコンテナに与えられていないため、docker 系ステップは常に失敗します。dind サイドカーは「ジョブコンテナを起動するためのデーモン」であり、ジョブコンテナ内に docker CLI を提供するものではありません。

解決策

  1. 【推奨】runner-config.yml のラベルマッピングを docker CLI 入りイメージ(例: catthehacker/ubuntu:act-latest 等)に変更し、ジョブコンテナから dind(または socket)へ到達可能にする。ワークフロー側は runs-on: ubuntu-latest のまま無変更。
  2. runner に /var/run/docker.sock をマウントしジョブへ共有(本構成は dind 前提のため不向き)。
  3. Docker 検証は CI から分離し docker-mcp でローカル実施(応急・現行運用。インフラ変更不要)。

依頼

修正はサーバー側の runner-config.yml 変更とランナー再起動が必要なため、@genji1024 さんに実施をお願いしたいです。修正完了まで private-opencode-server PR #4 は保留とします(#251 指示)。

## 概要 Forgejo act ランナー上で `docker` / `docker compose` 系の CI ジョブが常に失敗します。 失敗ログ: `docker: command not found`(exitcode 127)。 ## 背景 - genji1024/private-opencode-server PR #4 の docker-build ジョブが全 run で失敗。 - 失敗はジョブ実行コンテナ(ランナーイメージ node:20-bookworm)に docker CLI が無いためと観測されています(ci.yml コメント・実測記録あり)。 ## 再現手順 1. 本リポジトリの compose.yaml で server / docker-in-docker / runner を起動 2. 任意リポジトリのワークフローに `docker build`(または `docker compose`)ステップを置き `runs-on: ubuntu-latest` で実行 3. ステップが `docker: command not found`(exit 127)で失敗 ## 観測事実(compose.yaml の実設定から) - runner: `data.forgejo.org/forgejo/runner:13`。dind サイドカー(`docker:dind`・privileged・`-H tcp://0.0.0.0:2375 --tls=false`)を `DOCKER_HOST: tcp://docker-in-docker:2375` で使用。 - `runs-on: ubuntu-latest` は runner-config.yml でジョブ実行コンテナのイメージ(観測: `node:20-bookworm`)に解決されます。※ runner-config.yml はリポジトリに無く(`.gitignore` の `data/` 配下)、ラベル→イメージ対応がバージョン管理外。 - `node:20-bookworm` は素の Node.js イメージで docker CLI を含まず、ジョブコンテナには docker.sock / DOCKER_HOST も渡りません。 ## 根本原因(高確信) ジョブ実行コンテナのイメージ(node:20-bookworm)に docker CLI が存在せず、かつ dind デーモンへの到達手段もジョブコンテナに与えられていないため、docker 系ステップは常に失敗します。dind サイドカーは「ジョブコンテナを起動するためのデーモン」であり、ジョブコンテナ内に docker CLI を提供するものではありません。 ## 解決策 1. 【推奨】runner-config.yml のラベルマッピングを docker CLI 入りイメージ(例: catthehacker/ubuntu:act-latest 等)に変更し、ジョブコンテナから dind(または socket)へ到達可能にする。ワークフロー側は `runs-on: ubuntu-latest` のまま無変更。 2. runner に /var/run/docker.sock をマウントしジョブへ共有(本構成は dind 前提のため不向き)。 3. Docker 検証は CI から分離し docker-mcp でローカル実施(応急・現行運用。インフラ変更不要)。 ## 依頼 修正はサーバー側の runner-config.yml 変更とランナー再起動が必要なため、@genji1024 さんに実施をお願いしたいです。修正完了まで private-opencode-server PR #4 は保留とします(#251 指示)。
Owner

@bot-genji1024 先ほど main ブランチに runner-config.yml を追加しました。これを修正してもらいます。

ただ、このファイルを追跡対象に含めるにあたって、ファイルに含まれていたランナーの認証情報を削除したため、いまはランナーが認証されていません。まずは新しくイシューを立てて、コンテナ起動時に環境変数に設定されたインスタンス URL やトークンをもとに認証を実行するように修正してください。

そちらが解決するまでは本イシューの作業を保留します。

@bot-genji1024 先ほど main ブランチに `runner-config.yml` を追加しました。これを修正してもらいます。 ただ、このファイルを追跡対象に含めるにあたって、ファイルに含まれていたランナーの認証情報を削除したため、いまはランナーが認証されていません。まずは新しくイシューを立てて、コンテナ起動時に環境変数に設定されたインスタンス URL やトークンをもとに認証を実行するように修正してください。 そちらが解決するまでは本イシューの作業を保留します。
Author
Collaborator

実行結果

ご指示いただいたランナー認証の対応を実装し、新しいイシューと PR を作成しました。

  • 新規イシュー: #2(ランナーの認証を環境変数ベースで実行する)
  • PR: #3(feat(runner): authenticate via env vars at container startup)— Closes #2

本イシュー(ランナーのジョブ実行コンテナに docker CLI がない問題)の作業は、ご指示どおり上記の認証対応が解決(マージ)されるまで保留します。認証対応のマージ後、改めて着手の指示をいただければ対応します。

## 実行結果 ご指示いただいたランナー認証の対応を実装し、新しいイシューと PR を作成しました。 - 新規イシュー: #2(ランナーの認証を環境変数ベースで実行する) - PR: #3(feat(runner): authenticate via env vars at container startup)— Closes #2 本イシュー(ランナーのジョブ実行コンテナに docker CLI がない問題)の作業は、ご指示どおり上記の認証対応が解決(マージ)されるまで保留します。認証対応のマージ後、改めて着手の指示をいただければ対応します。
Sign in to join this conversation.
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
genji1024/forgejo-server#1
No description provided.