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 や本番環境でも安定して利用可能です。