/xxxx/xxxx.sh: line n: return: can only `return' from a function or sourced script エラー対処
最近取り組んでいる以下参考書についてです。
- 作者:山田 明憲
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
Dockerの手順に従って進めていたところ、
「4.2.7 MySQLコンテナを確認し、初期データを投入する」という手順において
コンテナに接続ができませんでした。
コンテナ内のログを確認すると、
以下のエラーが出力されていることが確認できました。
■エラー
/docker-entrypoint-initdb.d/prepare.sh: line 6: return: can only `return' from a function or sourced script
prepare.shでは以下のような記述内容となっています。
以下はDockerとしては一般的なもので、
Master構成の場合環境変数によって制御する仕様です。
つまり、Masterの環境変数がない = return 0で処理を終了するというものです。
■prepare.shの内容
# (1) MasterとSlaveを環境変数で制御する if [ ! -z "$MYSQL_MASTER" ]; then echo "this container is master" return 0 fi
しかしsourceで呼ばれているからなのか、
returnがreturnコマンドではなくfuncitionまたはsourceと誤認されてしまっているようです。
今回は暫定的に以下の通りexitに修正し、image buildを実行し直してdeployすればエラーが解消されました。
■暫定的な修正
# (1) MasterとSlaveを環境変数で制御する if [ ! -z "$MYSQL_MASTER" ]; then echo "this container is master" #return 0 exit 0 fi
■暫定的な修正
# (1) MasterとSlaveを環境変数で制御する if [ ! -z "$MYSQL_MASTER" ]; then echo "this container is master" どんな呼び出し方でも対応できるようにするには以下の通り returnでエラーが出たときにexitを実行するように修正すればOKです。 ■修正版 >|| # (1) MasterとSlaveを環境変数で制御する if [ ! -z "$MYSQL_MASTER" ]; then echo "this container is master" return 2>&- || exit fi
しかし、書籍ではこれでうまくいっているはずですが、、、
うーん謎です。