CloudBuildで外部Dockerコンテナにアクセスする

技術

CloudBuildでNode.jsアプリでJestテストの実行を行う際、テスト用mysqlコンテナにアクセスする方法の解決に時間がかかったので、メモとして残しておく。

目的

  • 前提として、node.jsで作成したnode_appコンテナがあり、appコンテナのテスト実行で外部のmysqlコンテナにアクセスする。

手順

アプリコンテナからアクセスするmysqlコンテナを用意

  • cloudbuildからは、docker-composeで事前に立ち上げるため、以下のyamlを作成
  • CloudBuildからアクセスできるようにnetworks/externalにcloudbuildという名前で追記
version: '3'
services:
 mysql:
   container_name: "mysql"
   image: mysql:5.7
   environment:
     - MYSQL_ROOT_PASSWORD=password
     - MYSQL_DATABASE=test_db
     - TZ=Asia/Tokyo
   ports:
     - '3306:3306'
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   volumes:
     - ./mysql/conf:/etc/mysql/conf.d/:ro
     - mysqldata:/var/lib/mysql
networks:
 default:
  external:
    name: cloudbuild
volumes:
 mysqldata:

node.jsアプリのconfig設定

  • node.jsアプリコンテナからテスト用mysqlコンテナにアクセスできるように設定
"test": {
    "username": "root",
    "password": "password",
    "database": "test_db",
    "host": "mysql",
    "dialect": "mysql",
  },

CloudBuildで実行させる処理を記載

  • 事前に準備したmysqlコンテナをdocker-composeで起動させる
  • テストを実行させるアプリコンテナをビルド
  • docker runでテスト実行する
  • docker runコマンドには、事前に準備したdocker-composeファイルnetworl/externalに記載した名前(cloudbuld)を–networkオプションにを指定すればOK
steps:
  # test container setup
- name: 'docker/compose:1.23.2'
  args: ['-f', 'docker-compose-cloudbuild.yml',
         'up', '-d', '--build']
  # build the container test image
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'asia.gcr.io/$PROJECT_ID/node_app:test', '.' ]
  # test run
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'run', '--network=cloudbuild', 'asia.gcr.io/$PROJECT_ID/node_app:test',
          'npm', 'run', 'test' ]

タイトルとURLをコピーしました