概要

GitLab RunnerでCIを回していた際に、Runnerで実行しているコンテナ内でdockerを使いたいという時には、Runnerの設定にprivileged = trueなどを追加して使うことになります。

しかし最近、このようなRunnerで次のエラーが発生して、CIがうまくいかないということが多く発生しました。

ERROR: Preparation failed: Error response from daemon: Conflict. The container name “/” is already in use by container “*”. You have to remove (or rename) that container to be able to reuse that name.

このエラーは、発生したりしなかったりするので、最初の内はエラーの発生も少なくエラーが発生してCIが止まったら手動でもう一度実行していたのですが、最近はエラーの発生頻度が多く、作業に支障をきたしていました。

エラーの内容は、コンテナ名が既に使われているため、新たにコンテナが作れず、実行したい場合は既にあるコンテナを削除するか名前を変える必要があるということを表しています。

対象

今回のエラーが発生するのは、GitLab Runnerでdockerを使っている場合です。

Kubernetesやshellなどを使っている場合は、このようなエラーは発生しません。

解決方法

エラーの解決のために色々調べましたが、開発リポジトリのIssueを探しても問題は提起されていましたが、解決方法は示されていませんでした。

そのため、時間があるときに調べていたため解決までに1ヶ月ほどかかってしまいましたが、解決方法を見つけ出すことができました。

エラーの解決には、GitLab Runnerの設定を次のように変更します。

[[runners]]
  name = "*******"
  url = "https://*********"
  token = "******"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "ruby:2.1"
    privileged = true
    disable_cache = true
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
    Insecure = false

一部セキュリティのため、伏せ字にしています。

重要な部分は、disable_cache = trueの部分です。

この部分は、デフォルトではdisable_cache = falseのようになっており、この設定によりVolumeのキャッシュ用のコンテナが作られるということになり、そのコンテナが悪さをして今回のエラーを発生させています。

そのため、キャッシュ用のコンテナを使わないようにするとコンテナ名の衝突が発生しなくなり、正常にRunnerが動作するようになります。

まとめ

この問題を解決するのには、長い時間がかかりました。

コンテナの中でdockerコマンドを使う、公式のドキュメントを見ても、disable_cacheはfalseになっており、この設定が悪さをしているということに気づくには時間がかかりました。

誰かが同じことで苦しむことがないことを祈って、解決方法をここに書いておきます。