はじめに
以下以外にもlogとかでローカルにマウントしている場合そこのフォルダの権限変えないといけないかもです(ほぼ確定)、でないとビルド時にエラー出るかもです(ほぼ確定)。
あと以下はdocker stopで止めて再度の時には上手くいきましたが、最初からだとsql接続確認作業必要になるかと思います。詳細はのgithub参考によろしくお願いいたします。私の確認色々してましてスマートではありません。なのであくまで参考にお願いします。接続確認というかはダンプ上手く入るまである程度for回して確認している感じです。
DockerhubのMYSQLで初期データ入れる場合は、/docker-entrypoint-initdb.d
って言われていますが、
今回はこの方法でやらない方法でやろうとしてハマったという感じでした。
ここまでしなくてもsleepある程度する的なやり方でも回避できると思いますが、
なぜ行うか?という箇所を明確に表示していたく色々やっていましたという感じでした!
やっていることとしては、
あるはずのものが出来上がるまで何回か確認しながら待つ的なことです。
ただ上記で書いたのと以下の公式的なもの見ると最終的には接続できる確認が必要かと思っています。
MySQL が正常に起動するのを待機していない場合は、サービスの起動前に接続再試行ループを配置する必要がある場合があります。
https://hub.docker.com/_/mysql
色々確認したいがために作ったものなので色々不要なもの入ってくるとは思いますがリポジトリも作成したのでここに置いておきます。
エラー内容
※確認しないでSQL入れようとすると以下のエラーが出て上手くいきませんでした、、オーノーサンタさんも泣いてますね。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
make[1]
解決のために書いたmakeのやつ
ちなみにここに来るまで色々してまして、それらここの記事のおまけとして書いたのでもしよかったらと思い載せてます!
db_check:
@echo '次の処理始める前に何回か確認します。確認作業は最高30かいほどおこないます。'
@for i in {1..30}; \
do sleep 1; \
mysql99_sock=`docker exec -i -t mysql99 bash -c 'ls /var/run/mysqld/mysqld.sock' | grep sock | cut -c 1-22 | sed 's/ //g'`; \
if [ $$mysql99_sock == '/var/run/mysqld/mysqld' ]; then \
echo '確認出来ましたので抜けます。'$$i'/30 回目'; \
break; \
else \
echo '確認出来ませんでした。'$$i'/30 回目'; \
fi; \
done
@echo 'おわり'
上記makefileのPOINT1
mysql99
はdockerのコンテナ名です。
上記makefileのPOINT2
ls /var/run/mysqld/mysqld.sock
であるはずのものがあるか確認します。
grep sock
<=これいらないかもと今書いてて思ったのですが残しておきますね。sock
のやつあるかの確認です。
上記makefileのPOINT3
cut -c 1-22
は上記で出力されたものはじめから22文字取得。以下のようなもの取得されます。
なぜわざわざこんなこと??と思うのですがif
のところで意図した取得できずという感じで、、
あとあえて全文でないのはここまで出力されていればあるの確認出来るのと <= 切り取り方がピッタシでないといけなかったのみで.
がエスケープの仕方間違えてるのかなぜか邪魔で上手く比較出来ずって感じですcut -c 24-27
とすればsock
で比較も可能+.
もあまり気にしなくてもいいかもと思っています。、ここら辺もっとスマートに出来そうなのですが自分はできなかったのでこんな感じでという感じです
/var/run/mysqld/mysqld
上記makefileのPOINT4
sed 's/ //g'
ですが、 /var/run/mysqld/mysqld.sock
がある時は問題ないのですが、ない時のエラー分に余白がでてきたりで後続処理で進むは進むのですがエラーが出てきてやだな〜と思い入れたという感じです。いや適当すぎっと思うかもしれないのですがこれぐらいしか思いつかず、、ちなみにこの処理ないと嫌な感じの出力されます。処理的には問題ないのでなくてもいいのですが、お好みで。
ちなみにない時の嫌な感じのやつです
次の処理始める前に何回か確認します。確認作業は最高30かいほどおこないます。
/bin/sh: command substitution: line 0: unexpected EOF while looking for matching `''
/bin/sh: command substitution: line 1: syntax error: unexpected end of file
/bin/sh: line 0: [: ==: unary operator expected
確認出来ませんでした。1/30 回目
/bin/sh: command substitution: line 0: unexpected EOF while looking for matching `''
/bin/sh: command substitution: line 1: syntax error: unexpected end of file
/bin/sh: line 0: [: ==: unary operator expected
確認出来ませんでした。2/30 回目
ある時のいい感じのやつです。
次の処理始める前に何回か確認します。確認作業は最高30かいほどおこないます。
確認出来ませんでした。1/30 回目
確認出来ませんでした。2/30 回目
確認出来ませんでした。3/30 回目
上記makefileのPOINT5
echo '確認出来ませんでした。'$$i'/30 回目'; \
ですが、確認出来ませんでした。30/30 回目
ってエラーで出てたら、あ、最後まで上手く行かなかったんだみたいにわかりやすくていいかなと思いという感じです。
上記makefileのPOINT6
if [ $$mysql99_sock == '/var/run/mysqld/mysqld' ];
はもうあったか?!って確認している感じのみとなります! $$
ってしないと取得出来ないらしいし実際そうだったのでこんな感じに書いてます。
おまけ(開発で全体的にどんな感じか)
参考
色々みたのですが決定的なものというものがあまりないのでなるべく記載しているのですが漏れ等あるかと思います。
すみません
そっか!lsで確認すればいいじゃないか!と気づかせてくれました!
https://teratail.com/questions/274750
意図したファイルがない時余白とか空いて綺麗じゃないので余白削除の方法を参考にさせていただきました!
https://ex1.m-yabe.com/archives/3306
出力の文字調整に参考にさせていただきました!
https://hensa40.cutegirl.jp/archives/1373
参考にさせて頂きありがとうございました!
最後に
正直こんな確認しなくてもいいと思ってはいます。
ただこういうのを自分で色々やっていたら『これ何やってるんだろう?どうしてやるんだろう?』みたいなクエスチョンが減るかもと思いやってみました。DB接続確認の時なぜか余白消せなく、プラスで余白消す処理をやったりしましたが、やりながらこんなことあるんだな〜とか思っていました。その他にmysql立ち上がってから正常に入れるまで約1分ぐらいかかる?とかも思ったりしました。待つって案外大事なのかもです。