はじめに
例によって参考サイトと首っぴきです。
https://ishida-it.com/blog/post/2019-11-23-docker-nodejs-mysql/
YAMLファイルで叱られました
$ docker-compose up -d ERROR: The Compose file './docker-compose.yml' is invalid because: Unsupported config option for services.networks: 'backend' Unsupported config option for services.volumes: 'mysqldata'
叱られる。めいめいの行のインデントが誤っていた。
修正して動いたのがこちら。
(なお必要なフォルダは作ってあるものとします。)
version: '3' services: mysql: image: mysql:5.7 env_file: ./mysql/mysql.env environment: - TZ=Asia/Tokyo ports: - '3306:3306' volumes: - ./mysql/conf:/etc/mysql/conf.d/:ro - mysqldata:/var/lib/mysql networks: - backend app: # 起動するイメージを指定(ここではNode.js v12の公式イメージ) image: node:12 # 環境変数を設定 environment: - DEBUG=app:* tty: true # ホスト側のポート:コンテナのポート ports: - '3000:3000' # ソースコードを格納するフォルダをマウント #(ホスト側の./srcをコンテナの/appにマウント) volumes: - ./src:/app # 起動時のカレントフォルダを指定 working_dir: /app # 起動後に実行するコマンドを指定 command: npm run dev networks: - backend depends_on: - mysql mail: image: mailhog/mailhog ports: - 8025:8025 networks: backend: volumes: mysqldata:
mailhogをつけました。これで、
http://127.0.0.1:3000/?message=test で実行状況が参照できて
http://127.0.0.1:8025/ でmailが見られます。
SequelizeによるDBマイグレーション
あとは参考リンク通りにSequelizeによるDBマイグレーションを行います…
$ docker-compose run --rm app npx sequelize-cli db:migrate Creating nodejsmysqldocker_app_run ... done Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5] Loaded configuration file "config/config.js". Using environment "development". ERROR: connect ECONNREFUSED 127.0.0.1:3306
叱られます。
あれこれググっていると、sequelize cliのhelpを参照できました。
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --help Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5] Options: --version Show version number [boolean] --help Show help [boolean] --env The environment to run the command in [string] [default: "development"] --config The path to the config file [string] --options-path The path to a JSON file with additional options [string] --migrations-path The path to the migrations folder [string] [default: "migrations"] --seeders-path The path to the seeders folder [string] [default: "seeders"] --models-path The path to the models folder [string] [default: "models"] --url The database connection string to use. Alternative to using --config files [string] --debug When available show various debug information [boolean] [default: false] --to Migration name to run migrations until [string] --from Migration name to start migrations from (excluding) [string]
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5] Loaded configuration file "config/config.js". Using environment "development". ERROR: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306 at ConnectionManager.connect (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:116:17) at processTicksAndRejections (internal/process/task_queues.js:97:5) EXTRA MESSAGE: connect ECONNREFUSED 127.0.0.1:3306
但し言われていることは文章量が増えた以外変わりません。
もしやと思い、src/config/config.js の先頭に
console.log(process.env.MYSQL_SERVER);
これを入れてみて、再度実行。5行目が上記の結果です。
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5] undefined # ←これが結果です Loaded configuration file "config/config.js". Using environment "development". ERROR: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306 at ConnectionManager.connect (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:116:17) at processTicksAndRejections (internal/process/task_queues.js:97:5) EXTRA MESSAGE: connect ECONNREFUSED 127.0.0.1:3306
ならば、と src/config/config.js を以下の様に修正後、執念く実行。
console.log(process.env.MYSQL_SERVER); module.exports = { development: { username: "root", password: "password", database: "todo", host: "mysql", dialect: 'mysql', }, test: { username: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DATABASE, host: process.env.MYSQL_SERVER, dialect: 'mysql', }, production: { username: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DATABASE, host: process.env.MYSQL_SERVER, dialect: 'mysql', }, };
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5] undefined Loaded configuration file "config/config.js". Using environment "development". == 20201029022948-create-task: migrating ======= == 20201029022948-create-task: migrated (0.073s)
やっと通りました。最初のリンクの次以降の項目へ戻ります。
.jadeファイルとか初見過ぎるけど後で追う。
なお src/routes/index.js の末尾は module.exports = router; で締めないと叱られる。
ここまでsequelizeとExpressのやってくれている仕事が多く理解が追いついていない節はありますが、動くものはまあできました。
あとは一旦githubに公開し、肉付けをしてみます。