Masato Izumi Portfolio

Docker + GitLabで出る「invalid spec: :/tmp/ssh-agent.sock」エラーの原因と解決法

GitLab 上のプロジェクトを Docker コンテナの中からクローンやプッシュなどの操作を行う際、SSH 認証が必要になります。通常ローカルでは、ホスト側の SSH エージェント(ssh-agent)が秘密鍵を保持しており、そのソケットファイルへのパスが **SSH_AUTH_SOCK** です。

このソケットを Docker コンテナ内にも共有することで、Docker 内からもホストの SSH 認証情報を使って GitLab にアクセスできるようになります。

🔍 エラーの正体は?

GitLab リポジトリを Docker コンテナから操作しようとした際、以下のようなエラーが出ることがあります。

invalid spec: :/tmp/ssh-agent.sock: empty section between colons

これは、Docker Compose で SSH エージェントのソケットをボリュームとしてマウントしようとした際に、環境変数 **SSH_AUTH_SOCK** が未設定だったために発生します。

📦 なぜ SSH_AUTH_SOCK が必要なのか?

Docker コンテナから GitLab(SSH接続)にアクセスするには、ホストマシンで動作している ssh-agent を通じて認証情報(秘密鍵)を使えるようにする必要があります。このとき、**SSH_AUTH_SOCK** がそのエージェントのソケットファイルの場所を指しています。

⚠️ エラーの発生パターン

Docker Compose などで以下のような指定をしている場合を考えます。

volumes:
  - ${SSH_AUTH_SOCK}:/tmp/ssh-agent.sock

しかし、ホスト側で **SSH_AUTH_SOCK** が未設定(または空文字)だった場合、Docker Compose は次のように解釈します。

:/tmp/ssh-agent.sock

これは「ホスト側パス」が空なので、Docker は不正なボリューム定義と判断してエラーを出力します。

✅ 解決法:SSH_AUTH_SOCK を正しく設定する

以下のコマンドを実行して、**ssh-agent** を起動・設定します。

# 1. ssh-agent を起動"
eval "$(ssh-agent -s)"

これは SSH 認証エージェントのデーモンを起動し、バックグラウンドで秘密鍵を保持してくれます。このコマンドにより **SSH_AUTH_SOCK** という変数に、ソケットファイルのパスが自動的にセットされます。

例:

# 2. SSH_AUTH_SOCK を設定
export SSH_AUTH_SOCK=$(find /tmp/ssh-* -type s)
# 3. 環境変数が正しく設定されたか確認
echo $SSH_AUTH_SOCK  # => /tmp/ssh-abc123/agent.5835

その後、Docker Compose を再実行します。

これにより、**docker-compose.yml** の以下の指定が、次のように展開されます。

volumes:
  - ${SSH_AUTH_SOCK}:/tmp/ssh-agent.sock

展開後:

/tmp/ssh-xyz123/agent.1234:/tmp/ssh-agent.sock

つまり、「ホスト → コンテナ」間で SSH 認証情報の橋渡しができるようになります。結果として、Docker コンテナ内から GitLab への SSH アクセスが成功します。

💡 補足

この方法は Dockerfileを一切変更せず、環境変数だけで安全に対処できるため、CI/CD や本番環境でも安定して利用可能です。

< 記事一覧へ戻る