关注分享主机优惠活动
国内外VPS云服务器

mysql docker-entrypoint.sh 分析

摘要:从参数的位置获取字符。 如果是,则检索该字符。 如果条件为真,则重置参数并通过命令添加前缀。 即加工后。

Docker Hub 上有许多有用的 Docker 镜像,但它们是如何工作的以及它们的作用是什么?它可能吗?如何使用它值得我们研究。 下面是对 MySQL 官方镜像中的 docker-entrypoint.sh 脚本的分析。

#!/bin/bashset - eo Pipefailshopt - nullglob############################# # ########## #### ##################### $0 如果在命令开头添加参数则在前面添加 mysqld参数,如 -f test ,然后在这段代码处理后,将 # $@ 参数变为 mysqld -f test 。    其中,${1:0:1} 从 $1 参数的第 0 个位置取一个字符。  例如,如果 $1 是 -f,则 # 接收“-”字符。  如果条件为真,则使用 set 命令重置 $@。    将 mysqld 前缀添加到参数中。 即$1处理后将#改为mysqld。    ############################################## ## ## ########## 如果命令以选项开头,则添加 mysqldif [ "${1:0:1}" = "-" ];  then set -[k4 ] mysqld "$@"fi#解析该参数,看是否是获取帮助信息的参数,并设置wantHelp值################ #################################### 必填选项 如果是这样,请跳过设置。停止 mysqldwantHelp=for arg;   在 -" 中执行 case "$arg" 吗?"|--help|--print-defaults|-V|-[k4 ]version) WantHelp=1 Break ;; esacdone############################ 从文件中读取变量值### ###### ## # ############## 用法:file_env VAR [DEFAULT]# 示例:file_env "XYZ_DB_PASSWORD" "example"# (您现在可以输入 "$XYZ_DB_PASSWORD_FILE" 的值 # "$XYZ_DB_PASSWORD"一个文件(特别是对于 Docker 的机密功能) file_env() { local var="$1" local fileVar="${var}_FILE" local def=" ${2:-}" if [ "${!var: -}" ] && [ "${!fileVar:-}" ]; 然后 echo >&2 "错误:$var 和 $ fileVar 均已设置(但互斥)" exit 1 fi local val="$def " if [ "${!var:-}" ] then val="${!var}" elif [ "${!fileVar:-}" ]; then val="$(&1 >/dev /null 命令 , #如果配置文件没有问题,此命令将成功,否则将打印一条错误消息并附加 ###############。 ################ ####### #######_check_config() { toRun=( " $@" --详细 [k4 ]-help ) if !errors="$("${ toRun[@]}" 2) >&1 >/dev/null)"; then cat >&2 <&2 "错误: 数据库已初始化" echo >&2 " 必须指定 MYSQL_ROOT_PASSWORD、MYSQL_ALLOW_EMPTY_PASSWORD 或 MYSQL_RANDOM_ROOT_PASSWORD 之一" exit 1 fi# 5.目录 mkdir -p "$DATADIR 创建"# 6.运行 mysqld 命令初始化数据库 echo "初始化数据库" "$@" --initialize-insecure echo "初始化数据库"# 7.command -v mysql_ssl_rsa_setup 检查命令是否可执行以及#server-key.pem 文件是否存在。  如果不存在,请使用命令 -v mysql_ssl_rsa_setup > /dev/null && [ ! - e "$DATADIR/server-key.pem" ]; /mysql/ MySQL - Server/BLOB/23032807537DD8EC1C4D4D4E12F9/DEB - IN/EXTRA/MYSQL - 84 Echo“初始化”证书“mysql_ssl_rsa_setup - -datadir="$DATADIR” echo“证书已初始化” fi# 8. 获取套接字值并启动 mysql SOCKET="$( _get_config "socket" "$@")" "$ @" --skip-networking --socket="$ {SOCKET}" & pid="$!"# 9. 设置 mysql 变量(列表格式),${mysql [@ ]} 运行 mysql=( mysql --protocol=socket -uroot - hlocalhost --socket="${SOCKET }" )# 10. 30.检查 mysql 是否为 {30..0} 中的 i 启动。   如果您想回显“SELECT 1”,请运行它。   "${mysql[@]}" &> /dev/null; then Break fi echo "MySQL init process in Progress..." sleep 1 done# 11. 如果 i 为 0,则 [ "$i" = 0 ] ; 表示mysql启动失败。  然后 echo >&2 "MySQL 初始化过程失败。" exit 1 fi# 11. 解决时区错误 if [ -z "$MYSQL_INITDB_SKIP_TZINFO" ]; # sed is https://bugs .mysql.com/bug.php? id=20545 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql_tzinfo_to_sql /usr/share/zoneinfo | id=20545   sed "s/必须设置本地时区 - - 请参阅 zic 手册页/FCTY/" "${mysql[@]}" mysql fi# 12. root 的随机密码生成 if [ ! -z " $MYSQL_RANDOM_ROOT_PASSWORD" ] ; 然后导出 MYSQL_ROOT_PASSWORD="$(pwgen -1 32)".echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD" fi# 13. 如果 MYSQL_ROOT_HOST 不为空或 localhost,则创建 root 用户 rootCreate= # 默认 root file_env 监听来自任何地方的连接 "MYSQL_ROOT_HOST" "%" if [ ! [ k4]z "$MYSQL_ROOT_HOST" -a "$MYSQL_ROOT_HOST" != "localhost" ]; # 不,我们不关心 read 是否在此文档中找到终止字符 # https://unix.stackexchange.com /questions/265149 /why-is-set-o-errexit -writing-this-read-heredoc-expression/265151 #265151 读取 - r - d "" rootCreate <<-EOSQL || true 创建用户 "root" @"${MYSQL_ROOT_HOST}" 将 *.* 上的所有内容授予 ${MYSQL_ROOT_HOST} ” 机智H 授予选项;EOSQL fi# 14. 重置“root”@“localhost”# 的 root 密码。 使用 $rootCreate 创建根 "${mysql[@]}" <<-EOSQL --。  不要复制文件 --。 否则,mysql-fabric 等产品将无法工作。  SET @@SESSION.SQL_LOG_BIN=0; SET PASSWORD FOR "root"@"localhost"=PASSWORD( "${MYSQL_ROOT_PASSWORD}") ; 使用 GRANT 选项将所有 *.* 授予“root”@“localhost”。   ${rootCreate} DROP DATABASE IF EXISTS test; EOSQL# 15. 如果设置了 root 密码并且需要添加 mysql root 密码,请使用 [ ! -z "$MYSQL_ROOT_PASSWORD" ]; -p "${MYSQL_ROOT_PASSWORD}" ) fi# 16. 如果设置了 MYSQL_DATABASE 变量,则 file_env "MYSQL_DATABASE" if [ "$MYSQL_DATABASE" ]; then echo "CREATE DATABASE IF NOT EXISTS `$MYSQL_DATABASE` ;" | "${mysql[@]}" mysql+=( "$MYSQL_DATABASE" ) fi# 17. 在数据库中创建用户 file_env "MYSQL_USER" file_env "MYSQL_PASSWORD" if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ] then echo "创建用户 "$MYSQL_USER"@"%" IDENTIFIED BY "$MYSQL_PASSWORD" ;" | if [ "$MYSQL_DATABASE" ]; "GRANT ALL ON `$MYSQL_USER"@"%" ;" | "$MYSQL_USER"@"%" ;" | fi# 18. /docker-entrypoint-initdb 下.d 目录中,运行包含 shell 和 /docker-entrypoint-initdb 中 f 的 SQL 回显的脚本。   d /*; 在 *.sh 中执行 case "$f") echo "$0: running $f";"$f" ;; *.sql) echo "$0: 运行 $f"; "${mysql[@]}" < "$f"; echo *.sql.gz) echo "$0: $ 运行 f "; Gunzip -c "$f" | "${mysql[@]}"; echo ;; *) echo "$0: 忽略 $f" ;; esac echo done# 19. [ 如果 !, 设置是否root 密码已过期。   -z "$MYSQL_ONETIME_PASSWORD" ]; 然后 "${mysql[@]}" <&2 "MySQL 初始化过程失败。" exit 1 fi# 21。初始化成功后,再次启动 echo。  echo "MySQL初始化过程完成。准备启动。 echo fifi# 22.正式启动数据。"库可执行文件“$@”

未经允许不得转载:主机频道 » mysql docker-entrypoint.sh 分析

评论 抢沙发

评论前必须登录!