DockerのMysqlでSQLファイルを実行させたい!
こんにちは。
GolangにてブログAPIの作成をしている際に、Docker環境を用いてDB(Mysql)を用意して処理を行うとしていました。コマンドでSQLクエリを実行するのはいささか面倒なため、SQLファイルを作成し、それを実行させようと試みましたが、うまくいかない!!
今回はこれの解決法を記します。
うまくいかなかったコマンド
mysql -h localhost -u docker sampledb -p | createTable.sql
dockerコンテナを立ち上げた状態で、上記コマンドを打ち込みましたが、うまくいかず。。。
コマンドの意味としては、localhost上で動作するMysqlサーバー内におけるsampledbに対してdockerユーザでcreateTable.sqlファイルを実行してください。というものです(この認識が間違っているのかな。。。?)
解決策
上記コマンドではうまくいかなかったため、全く別の方法をとりました。
1.Dockerコンテナ内にSQLファイルをコピー
2.Dockerコンテナ内に移動
3.Mysqlを起動し、SQLファイルを実行させる
それではひとつずつ見ていきましょう
0.前提
まずDockerコンテナがきちんと立ち上がっているか、また、Mysqlが立ち上がっているかを確認してください。
docker-compose up
1.Dockerコンテナ内にSQLファイルをコピー
ローカルからファイルを呼び出してもうまくいかないと判断したため、コンテナ内にSQLファイルを移すことにしました。
下記はローカルのSQLファイルをDockerコンテナ内にコピーするコマンドです。
docker cp {sqlファイル名} {DockerコンテナID}:{コピー先のファイル名}
例
docker cp createTable.sql 123456789:/tmp/
上記におけるDockerコンテナIDの調べ方は以下の通りです。
docker ps
#実行結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
### ### ### ### ### ###
上記のような結果のCONTAINER IDの下に記述してある文字列がコンテナIDにあたります
2.Dockerコンテナ内に移動
コンテナ内に実行させたいSQLファイルを移すことが来たら、コンテナ内に移動する。
コンテナ名に関しては、docker-compose.yamlに記述していると思います。
docker exec -it {コンテナ名} bash
例
docker exec -it test-container bash
SQLファイルを保存したファイルまで移動する
cd ファイル名
例
cd tmp
先ほど保存したSQLファイルがあるかを確認する
ls
#実行結果
createTable.sql
lsコマンドでローカルからコンテナ内に移したファイルの存在が確認出来たら成功です!!
あとはこれをmysqlで実行させるだけです。
3.Mysqlを起動し、SQLファイルを実行させる
mysqlにアクセス
mysql -u root -p
パスワード入力
使いたいデータベースを指定する
use {DB名}
例
use sampledb
実行させたいSQLファイルを指定
source {SQLファイル名}
例
source createTable.sql
さいごに
上記の流れで私はSQLファイルを実行させることができました。
最初に実行していたコマンドでうまくできない理由は分からないので有識者教えていただけたら幸いです。
このエラー(?)で2日間もGoの勉強かつAPIの作成が遅れた。。。
まぁDockerの勉強になったからよしとします。