Open49

オープンソースを読む Dockerfile https://github.com/docker-library/mysql

イネダイネダ

Stdinということは、パイプでも使えるのか?

https://github.com/docker-library/mysql/blob/master/8.0%2Fdocker-entrypoint.sh#L5-L22

イネダイネダ

引数と標準入力両方取れる。

echo "arg1" "arg2" | log "INFO"2024-01-29 12:51:44+09:00 [INFO] [Entrypoint]: arg1 arg2
イネダイネダ
複数行のログにも対応できる
mysql_error <<-'EOF'
			Database is uninitialized and password option is not specified
			    You need to specify one of the following as an environment variable:
			    - MYSQL_ROOT_PASSWORD
			    - MYSQL_ALLOW_EMPTY_PASSWORD
			    - MYSQL_RANDOM_ROOT_PASSWORD
		EOF
イネダイネダ

-e | 何かのエラーが発生した時点で、処理を中断
-u | 未定義の変数を使ったらエラー
-x | 実行したコマンドを標準エラーに出力

イネダイネダ

https://github.com/docker-library/mysql/blob/master/8.0%2FDockerfile.oracle#L24-L24

イメージ内で得られるユーザとグループは UID/GID に依存しないため、イメージの構築に関係なく次の UID/GID が割り当てられます。そのため、これが問題になるのであれば、UID/GID を明確に割り当ててください。

TTY やシグナル転送を使わないつもりであれば、 sudo のインストールや使用を避けたほうが良いでしょう。使うことで引き起こされる問題の解決は大変だからです。もし、どうしても sudo のような機能が必要であれば(例:root としてデーモンを初期化するが、実行は root 以外で行いたい時)、 「 gosu 」を使うことができます。

イネダイネダ
set -eo pipefail
shopt -s nullglob
イネダイネダ
#!/bin/bash

ls  *.TXT
sts=$?
echo;echo "status [$sts]"

echo '=> shopt -s nullglob'

shopt -s nullglob
ls *.TXT
sts=$?
echo;echo "status [$sts]"
出力
ls: '*.TXT' にアクセスできません: そのようなファイルやディレクトリはありません

status [2]
=> shopt -s nullglob
a.sh  dist  node_modules  package.json  pnpm-lock.yaml  src  tsconfig.json

status [0]
イネダイネダ

ワイルドカードの置き換えを強制するもののようだ

ヒットするものが無い場合には 後ろがnullで展開されて lsになっているんだと思う、

イネダイネダ
#!/bin/bash

echo *.TXT

echo '=> shopt -s nullglob'
shopt -s nullglob

echo *.TXT 
イネダイネダ

アスタリスクをとりあえず展開させるという意味合いだとおもう。

イネダイネダ
#!/bin/bash


function a() {
	local a=$(( ${#FUNCNAME[@]} - 1 ))
	echo $a

	echo ${FUNCNAME[4]}
	echo ${FUNCNAME[3]}
	echo ${FUNCNAME[2]}
	echo ${FUNCNAME[1]}
	echo ${FUNCNAME[0]}
}

function b() {
	a
}

function c() {
	b
}

c

main
c
b
a

イネダイネダ
if ! _is_sourced; then
	_main "$@"
fi

batsのテストでもこれは使えるんじゃないか?

イネダイネダ
# check to see if this file is being run or sourced from another script
_is_sourced() {
	# https://unix.stackexchange.com/a/215279
	[ "${#FUNCNAME[@]}" -ge 2 ] \
		&& [ "${FUNCNAME[0]}" = '_is_sourced' ] \
		&& [ "${FUNCNAME[1]}" = 'source' ]
}
イネダイネダ
cat <<-EOF
	[client]
	password="${MYSQL_ROOT_PASSWORD}"
EOF
イネダイネダ
mysql --defaults-extra-file=<( _mysql_passfile "${passfileArgs[@]}") 

パスワードファイルを直接出力から指定する。
TEMPに一回吐き出さない。。

イネダイネダ

https://dev.mysql.com/doc/refman/8.0/ja/binary-log.html

使用されたバイナリログファイルを追跡するために、mysqld はバイナリログファイルの名前を含むバイナリログインデックスファイルも作成します。 デフォルトでは、これはバイナリログファイルと同じベース名を持ち、拡張子は'.index'です。 バイナリログインデックスファイルの名前は、--log-bin-index[=file_name] オプションを使用して変更できます。 mysqld の動作中にこのファイルを手動で変更しないでください。変更すると、mysqld を混乱させることになります。

イネダイネダ
イネダイネダ

if文 と if [] の違い
if文 は前の実行コマンドの結果が0かどうかを判定している。
0であればtrue

if [] は [] がコマンド でifはその判定を行っている。

if ! errors=$( XXXX 2>&1 /dev/null ); then

については、コマンドの出力をerrosに代入して、 コマンドの実行結果をifで判定している