背景
現在開発にかかわっているプロダクトの機能開発において、マイグレーション処理が必要なPRのマージをするときにステージング環境へのマイグレーション作業を自動でおこないたかった
アサインされた当時の計画
- 指定フォルダにマイグレーション用のファイルが追加されたことを検知する
- gcloudコマンドでsecret Managerからデータベースにパスワードを取得
- ステージング環境のCloudSQLに接続するためにcloudsql-proxyを起動(このときはdocker runで最新のコンテナイメージを取得し、軌道までを行っていた)
- sql-proxyのコンテナを通じてcloud sqlに接続を試みるが失敗
詰まったところ1:CircleCI上でcloudsql-proxyの起動がうまく行かなった。
公式ドキュメントを参考に以下のコマンドを実行するJobを作成しても Unable to load config file: error="read /config/config.json: is a directory"
みたいなエラーでCIが落ちていた
docker run -d \
-v <PATH_TO_KEY_FILE>:/path/to/service-account-key.json \
-p 127.0.0.1:1433:1433 \
gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0 \
--credentials-file /path/to/service-account-key.json <INSTANCE_CONNECTION_NAME>
原因と解決策
service-account-key.jsonで指定していたものが間違っていたのかと試行錯誤するもエラーは変わらず。
たどり着いたのがCircleCIのドキュメントで、どうやらフォルダーのマウントに問題があったらしい。
以下のように変更することで起動に成功した。
- run: |
# 設定ファイルとボリュームを保持するダミー コンテナを作成します。
docker create -v /cfg --name configs alpine:3.4 /bin/true
# このボリュームに設定ファイルをコピーします。
docker cp /path/to/service-account-key.json configs:/cfg
docker run -d \
--volumes-from configs \
-p 127.0.0.1:1433:1433 \
gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0 \
--credentials-file /cfg/service-account-key.json <INSTANCE_CONNECTION_NAME>
詰まったところ2:cloudsqlに接続できない
1つ目の問題が解決したところで次に行うのはデータベースへの接続だ。
参考にしたのは以下の記事。
CircleCIでCloud SQLに接続した時の問題と解決策 - Qiita
自分がまだCircleCIになれていないのもあって、とりあえずコピペでやってみたものの、connection refusedがつづいた
原因調査(まだ解決まで至っていないので参考になりそうなものをリストアップしていく)
-
https://circleci.com/docs/ja/building-docker-images/#separation-of-environments
- dockerizeで指定するホストがあやしいかも
- CircleCI上でのdockerの扱いを理解する必要がある
-
https://circleci.com/docs/ja/using-docker/#using-multiple-docker-images
- 複数のコンテナイメージを並べた場合、最初のモノをプライマリコンテナとする
- ふたつめにDBなどを指定しているとMYSQLの場合は localhost:3306へのバインドを試みる
- 同じイメージをリストアップするときはそれぞれのimageになまえをつけることで競合を回避できる