MySQL容器中docker-entrypoint-initdb.d目錄的使用
MySQL容器docker-entrypoint-initdb.d目錄
docker-entrypoint-initdb.d 是一個特殊的目錄,專用于 Docker 中的 MySQL 容器。
當(dāng)使用 Docker 運(yùn)行 MySQL 容器時,如果這個目錄存在并且包含 SQL 腳本或其它可執(zhí)行文件,Docker 會在 MySQL 服務(wù)啟動之初自動執(zhí)行這些腳本。
這一機(jī)制使得在首次啟動容器時能夠方便地進(jìn)行一些初始化設(shè)置,比如創(chuàng)建數(shù)據(jù)庫、表、用戶,以及導(dǎo)入數(shù)據(jù)等。
具體來說,docker-entrypoint-initdb.d
目錄下的文件執(zhí)行有以下特點:
- 執(zhí)行順序通常是按文件名排序。
- 支持
.sh腳本(可執(zhí)行權(quán)限)和 SQL 腳本(.sql)。 - 這些腳本只在容器的 MySQL 數(shù)據(jù)卷為空時運(yùn)行,即首次啟動時。如果數(shù)據(jù)卷已有數(shù)據(jù)(例如容器重啟),這些初始化腳本不會再次執(zhí)行,以防止數(shù)據(jù)被重復(fù)初始化覆蓋。
利用這個機(jī)制,開發(fā)者可以通過 Dockerfile 或者在運(yùn)行容器時通過 -v 選項掛載包含初始化腳本的本地目錄到 docker-entrypoint-initdb.d,從而實現(xiàn) MySQL 容器的自動化配置和數(shù)據(jù)初始化。
docker-entrypoint-initdb.d下的sql腳本在啟動docker時沒有執(zhí)行原因
docker鏡像啟動時會執(zhí)行entrypoint.sh腳本;
其中關(guān)于是否執(zhí)行數(shù)據(jù)庫初始化的核心代碼如下:
由腳本可以看出,對于docker-entrypoint-initdb.d 目錄下的sql 文件,在執(zhí)行前會判斷 DATABASE_ALREADY_EXISTS 是否為false
即 $DATADIR/mysql 目錄并不存在;
但凡該服務(wù)器已經(jīng)存在任何數(shù)據(jù)庫,那么這個文件肯定不為空,故而不會執(zhí)行sql腳本;
docker_setup_env() {
# Get config
declare -g DATADIR SOCKET
DATADIR="$(mysql_get_config 'datadir' "$@")"
SOCKET="$(mysql_get_config 'socket' "$@")"
# Initialize values that might be stored in a file
file_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_EXISTS
if [ -d "$DATADIR/mysql" ]; then
DATABASE_ALREADY_EXISTS='true'
fi
}
_main() {
# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then
set -- mysqld "$@"
fi
# skip setup if they aren't running mysqld or want an option that stops mysqld
if [ "$1" = 'mysqld' ] && ! _mysql_want_help "$@"; then
mysql_note "Entrypoint script for MySQL Server ${MYSQL_VERSION} started."
mysql_check_config "$@"
# Load various environment variables
docker_setup_env "$@"
docker_create_db_directories
# If container is started as root user, restart as dedicated mysql user
if [ "$(id -u)" = "0" ]; then
mysql_note "Switching to dedicated user 'mysql'"
exec gosu mysql "$BASH_SOURCE" "$@"
fi
# there's no database, so it needs to be initialized
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
docker_verify_minimum_env
# check dir permissions to reduce likelihood of half-initialized database
ls /docker-entrypoint-initdb.d/ > /dev/null
docker_init_database_dir "$@"
......
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker-compose+nginx部署前后端分離的項目實踐
本文主要介紹了docker-compose?+?nginx部署前后端分離的項目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Docker安裝RabbitMQ AMQP協(xié)議及重要角色
這篇文章主要為大家介紹了Docker安裝RabbitMQ AMQP協(xié)議和主要角色詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Docker中Dockerfile之容器中運(yùn)行MyEclipse搭建的JavaWeb項目
本篇文章主要介紹了Docker中Dockerfile之容器中運(yùn)行MyEclipse搭建的JavaWeb項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

