質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1113閲覧

docker-composeでのnode(loopback)とmysqlの疎通エラー

sanezane

総合スコア91

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2021/10/16 17:45

やりたいこと

node(フレームワーク: loopback4)での環境をapp, データベースをdbとしてdocker-composeで構築し疎通したい

現状

docker-compose up時にappがエラーで停止する(ローカルからdbへの接続は確認済み)

エラー内容

Error: connect ECONNREFUSED 127.0.0.1:3306 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1146:16) app_1 | errno: -111, app_1 | code: 'ECONNREFUSED', app_1 | syscall: 'connect', app_1 | address: '127.0.0.1', app_1 | port: 3306, app_1 | fatal: true

やったこと

  • dbとの接続のために指定するhostをdocker-composeのサービス名(db)へ変更
  • my.cnfの外部ホストからの接続設定をbind-address=127.0.0.1からbind-address=0.0.0.0へ変更
  • デバッグ方法などご教授いただけるととても嬉しいです。

現在のDockerfile, docker-compose.yml

yml

1version: "3.8" 2volumes: 3 mydata: 4 db-store: 5services: 6 app: 7 build: 8 context: . 9 dockerfile: Dockerfile 10 volumes: 11 - type: volume 12 source: mydata 13 target: /data 14 volume: 15 nocopy: true 16 - type: bind 17 source: ./src 18 target: /work/src 19 environment: 20 - DB_CONNECTION=mysql 21 - DB_HOST=db 22 - DB_PORT=3306 23 - DB_DATABASE=${DB_NAME} 24 - DB_USERNAME=${DB_USER} 25 - DB_PASSWORD=${DB_PASS} 26 depends_on: 27 - db 28 - db-testing 29 ports: 30 - "3000:3000" 31 db: 32 image: mysql:8.0 33 volumes: 34 - db-store:/var/lib/mysql 35 - ./logs:/var/log/mysql 36 - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf 37 environment: 38 - MYSQL_DATABASE=${DB_NAME} 39 - MYSQL_USER=${DB_USER} 40 - MYSQL_PASSWORD=${DB_PASS} 41 - MYSQL_ROOT_PASSWORD=${DB_PASS} 42 - TZ=${TZ} 43 ports: 44 - ${DB_PORT}:3306 45 46 db-testing: 47 image: mysql:8.0 48 volumes: 49 - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf 50 tmpfs: 51 - /var/lib/mysql 52 - /var/log/mysql 53 environment: 54 - MYSQL_DATABASE=${DB_NAME} 55 - MYSQL_USER=${DB_USER} 56 - MYSQL_PASSWORD=${DB_PASS} 57 - MYSQL_ROOT_PASSWORD=${DB_PASS} 58 - TZ=${TZ}
  • dockerfile
# Check out https://hub.docker.com/_/node to select a new base image FROM node:16-slim # Set to a non-root built-in user `node` USER node # Create app directory (with user `node`) RUN mkdir -p /home/node/app WORKDIR /home/node/app # Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY --chown=node package*.json ./ RUN npm install # Bundle app source code COPY --chown=node . . RUN npm run build # Bind to all network interfaces so that it can be mapped to the host OS ENV HOST=0.0.0.0 PORT=3000 EXPOSE ${PORT} CMD [ "node", "." ]

mysql起動時に読み込ませるmy.cnf

[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqldump] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_bin lower_case_table_names=1 # Enable access from the host machine. bind-address=0.0.0.0

mysqlとの疎通のためにapp側へ入れているライブラリ

"loopback-connector-mysql": "^6.0.2",
  • package.json全体
{ "name": "mysql-tutorial", "version": "0.0.1", "description": "sample", "keywords": [ "loopback-application", "loopback" ], "main": "dist/index.js", "types": "dist/index.d.ts", "engines": { "node": ">=10.16" }, "scripts": { "build": "lb-tsc", "build:watch": "lb-tsc --watch", "lint": "yarn run eslint && yarn run prettier:check", "lint:fix": "yarn run eslint:fix && yarn run prettier:fix", "prettier:cli": "lb-prettier \"**/*.ts\" \"**/*.js\"", "prettier:check": "yarn run prettier:cli -l", "prettier:fix": "yarn run prettier:cli --write", "eslint": "lb-eslint --report-unused-disable-directives .", "eslint:fix": "yarn run eslint --fix", "pretest": "yarn run rebuild", "test": "lb-mocha --allow-console-logs \"dist/__tests__\"", "posttest": "yarn run lint", "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js && yarn run posttest", "docker:build": "docker build -t mysql-tutorial .", "docker:run": "docker run -p 3000:3000 -d mysql-tutorial", "premigrate": "yarn run build", "migrate": "node ./dist/migrate", "preopenapi-spec": "yarn run build", "openapi-spec": "node ./dist/openapi-spec", "prestart": "yarn run rebuild", "start": "node -r source-map-support/register .", "clean": "lb-clean dist *.tsbuildinfo .eslintcache", "rebuild": "yarn run clean && yarn run build" }, "repository": { "type": "git", "url": "" }, "author": "yosuke0517 <yosuke.takeuchi.dev@gmail.com>", "license": "", "files": [ "README.md", "dist", "src", "!*/__tests__" ], "dependencies": { "@loopback/boot": "^3.4.3", "@loopback/core": "^2.17.0", "@loopback/repository": "^3.7.2", "@loopback/rest": "^10.0.1", "@loopback/rest-explorer": "^3.3.3", "@loopback/service-proxy": "^3.2.3", "loopback-connector-mysql": "^6.0.2", "tslib": "^2.0.0" }, "devDependencies": { "@loopback/build": "^7.0.1", "@loopback/eslint-config": "^11.0.1", "@loopback/testlab": "^3.4.3", "@types/node": "^10.17.60", "eslint": "^7.32.0", "source-map-support": "^0.5.20", "typescript": "~4.3.5" } }

DB接続の設定ファイル(db.datasource.ts)

const config = { name: 'db', connector: 'mysql', url: '', host: 'db', port: 3306, user: 'loopback', password: 'password', database: 'demo' };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/10/17 00:24

ログの内容はdb.datasource.tsの設定が使われてないように見えますね 作ったdb.datasource.tsが使われてない可能性はないですか
sanezane

2021/10/17 04:32 編集

ご指摘のおかげで調査が進み、解決しました(自己解決として記載)。大変助かりました!
guest

回答1

0

自己解決

自己解決

何をやったか

    1. まず、image,volumeの削除をしてビルドし直し。するとエラーが以下のように変化
Error: connect ECONNREFUSED 192.xxx.xxx.x:3306 app_1 | errno: -111, app_1 | code: 'ECONNREFUSED', app_1 | syscall: 'connect', app_1 | address: '192.xxx.xxx.x', app_1 | port: 3306, app_1 | fatal: true

これでホストは合ってそう

    1. app側の起動を遅らせた

docker-compose.ymlのapp側にentrypoint: "/bin/sh -c 'sleep 10 && node .'"みたいな感じで追加(dbが起動した後にappを起動する的なやり方もあるはず)

上記までやってマイグレーションを試みたら別のエラーが発生

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
  • MySQL8.0でパスワードの認証形式が変更されているが、Node.jsの「mysql」にはまだ実装されていないようなのでMySQL: 5.7へ変更(コチラの対応をすれば8系でもいけるようだが他にも8系ではダメなことがあると嫌なので5.7にした)

上記対応で一旦疎通完了

投稿2021/10/17 04:30

sanezane

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問