关于docker
docker 镜像启动时 会执行 entrypoint.sh 脚本;其中关于是否执行数据库初始化的核心代码如下:
由脚本可以看出,对于docker-entrypoint-initdb.d 目录下的sql 文件,在执行前会判断 DATABASE_ALREADY_EXISTS 是否为false
即 $DATADIR/mysql 目录并不存在;但凡该服务器已经存在任何数据库,那么这个文件肯定不为空,故而不会执行sql脚本;
docker_setup_env() {# Get configdeclare -g DATADIR SOCKETDATADIR="$(mysql_get_config 'datadir' "$@")"SOCKET="$(mysql_get_config 'socket' "$@")"# Initialize values that might be stored in a filefile_env 'MYSQL_ROOT_HOST' '%'file_env 'MYSQL_DATABASE'file_env 'MYSQL_USER'file_env 'MYSQL_PASSWORD'file_env 'MYSQL_ROOT_PASSWORD'declare -g DATABASE_ALREADY_EXISTSif [ -d "$DATADIR/mysql" ]; thenDATABASE_ALREADY_EXISTS='true'fi
}_main() {# if command starts with an option, prepend mysqldif [ "${1:0:1}" = '-' ]; thenset -- mysqld "$@"fi# skip setup if they aren't running mysqld or want an option that stops mysqldif [ "$1" = 'mysqld' ] && ! _mysql_want_help "$@"; thenmysql_note "Entrypoint script for MySQL Server ${MYSQL_VERSION} started."mysql_check_config "$@"# Load various environment variablesdocker_setup_env "$@"docker_create_db_directories# If container is started as root user, restart as dedicated mysql userif [ "$(id -u)" = "0" ]; thenmysql_note "Switching to dedicated user 'mysql'"exec gosu mysql "$BASH_SOURCE" "$@"fi# there's no database, so it needs to be initializedif [ -z "$DATABASE_ALREADY_EXISTS" ]; thendocker_verify_minimum_env# check dir permissions to reduce likelihood of half-initialized databasels /docker-entrypoint-initdb.d/ > /dev/nulldocker_init_database_dir "$@"......
发布评论