Go言語の共通モジュールをGitHubのPrivate Repoからimportしたい – コンテナ編

こんにちは。てぃろです。

今回は前回のローカル編に続いてコンテナ編として、コンテナ開発で利用するための工夫について記載していきたいと思います。

ローカルとコンテナの違い

まずローカルとコンテナの違いは、各種認証情報をローカルから取得できるかどうかが大きな違いです。

ローカル開発では、ghコマンドで認証するだけでプライベートリポジトリにアクセスできることを、前回の記事で紹介しました。これはプライベートリポジトリからimportしようとしたときにghコマンドによってバックグラウンドで保存された認証情報を自動的に探して使用してくれているからです。

しかし、コンテナをビルドする際、特に設定をしなければ、コンテナはローカルのファイルにアクセスできません。つまり、ローカル編の設定をするだけではコンテナのビルドは成功しません。

では、どうすればいいかというと、ローカルの認証情報を参照できるようにすればいいのです。

コンテナビルドの一工夫

結論から書くと、goのモジュールをダウンロードする前に以下のコマンドを実行するようにします。

git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"

このコマンドを設定すると、gitがモジュールをダウンロードする際に、ローカルの認証情報(環境変数)を参照し、$GITHUB_TOKENを含めたURLに置き換えてアクセスできるようになります。これによってコンテナビルドのプロセス中でもGitHubのプライベートリポジトリへのアクセスが可能になります。

$GITHUB_TOKENはローカルにて環境変数として定義しており、値にはPersonal Access Tokenを使用します。

Personal Access Tokenの権限はClassicの場合には、repoのみチェックを入れればOKです。

具体的にDockerfileに書き込むコマンドは以下の通りにするとよいです。

RUN export GOPRIVATE=github.com/private-repo && \
    git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/" && \
    go mod download

こちらをgoのバイナリをビルドする前に実行しておきます。そうすればgoのビルド時にはプライベートリポジトリのモジュールがダウンロード可能となり、ビルドが成功すると思います。

最後に

コンテナ編では、コンテナビルドで使用するためのポイントを1つ紹介しました

これ以外のプライベートリポジトリをimportして使うためのポイントはローカル編で書いてますので、そちらを参照してください。ここまで書いたことを実践すれば、プライベートリポジトリで共通モジュールを管理していくことができるようになると思います。

開発中のモジュール番号の切り替えなど、一部で面倒な部分は残りますが、結局のところ万能な解決策は存在しません。どれも必要に応じてメリットとデメリットを見極めながらもっとも安全な方法や生産性が高い方法など、そのときどきの判断軸で選択していくしかないと思います。

ぜひその選択肢の一つにこの方法も入れてもらって、より有用な開発方法を模索してもらうことに貢献できればと思います。