<メモ>Docker + MySQL5.7 + phpMyAdmin環境にNode + Typescriptを追加する

## 初めに
https://qiita.com/A-Kira/items/f401aea261693c395966
MySQL5.7 + phpMyAdminの環境構築は↑の記事を参考にさせていただきましたm(_ _)m
NodeとTypescriptを追加して、mysqlに接続してみる。

## 環境
macOS Mojava 10.14.4
MySQL 5.7.28

## ディレクトリ構成
```
├── docker
│   ├── node # 追加
│   │   └── Dockerfile
│   ├── src # 追加
│   │   └── sql_connect.ts
│   └── db
│       ├── data
│       ├── my.cnf
│       └── sql
│           └── 001-create-tables.sql 
└── docker-compose.yml
```

## docker-compose.ymlを編集
nodeコンテナを追加する

```docker-compose.yml
version: '3'

services:
  # 追加
  node:
    build: ./docker/node
    tty: true
    volumes:
      - .:/work
    working_dir: /work
  # 以下変更なし
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 8080:80
```

## Dockerfileを作成
alpine linux ベース
`bash`ではなく`ash`を利用する

```Dockerfile
FROM node:12.8-alpine
LABEL maintainer "ucan"

RUN yarn global add typescript
```

## コンテナ起動確認
```
$ docker-compose up -d --build && docker ps
```

```
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                               NAMES
95814005a88d        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp                test_phpmyadmin
7a4b7090160e        mysql57_node            "docker-entrypoint.s…"   4 hours ago         Up 4 hours                                              mysql57_node_1
d1b1fcc6e15b        mysql:5.7               "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_host
```

## MySQL接続確認
```
$ mysql -uroot -p -h 0.0.0.0 --port 3306
 > use test_database;
 > INSERT INTO test_table (name) VALUES ('MY'); # データを追加
```

## phpMyAdmin起動確認
http://localhost:8080/

## 実行環境の確認
```
$ docker-compose exec node ash
/work # node --version
v12.8.1
/work # yarn --version
1.17.3
/work # tsc --version
Version 3.6.4
```

## Typescriptでmysqlに接続
```
$ yarn init
$ tsc --init
$ yarn add promise-mysql @types/mysql # 使用するライブラリ
```
### sql_connect.ts
https://github.com/CodeFoodPixels/node-promise-mysql

```sql_connect.ts
import * as mysql from 'promise-mysql';

async function connection() {
  const connection = await mysql.createConnection({
    host: '0.0.0.0',
    port: 3306,
    user: 'root',
    password: 'root',
    database: 'test_database',
  });
  return connection;
}

connection().then(connection => {
  const result = connection.query('SELECT * FROM test_table');
  connection.end();

  return result;
}).then(function(rows) {
  console.log(rows);
});
```

```
$ tsc sql.ts && node sql.js
[ RowDataPacket { id: 1, name: 'MY', created_at: null, updated_at: null } ]
```

## 参考記事
https://qiita.com/A-Kira/items/f401aea261693c395966
https://hub.docker.com/_/node/