MySQL容器中docker-entrypoint-initdb.d目錄的使用
MySQL容器docker-entrypoint-initdb.d目錄
docker-entrypoint-initdb.d
是一個(gè)特殊的目錄,專用于 Docker 中的 MySQL 容器。
當(dāng)使用 Docker 運(yùn)行 MySQL 容器時(shí),如果這個(gè)目錄存在并且包含 SQL 腳本或其它可執(zhí)行文件,Docker 會(huì)在 MySQL 服務(wù)啟動(dòng)之初自動(dòng)執(zhí)行這些腳本。
這一機(jī)制使得在首次啟動(dòng)容器時(shí)能夠方便地進(jìn)行一些初始化設(shè)置,比如創(chuàng)建數(shù)據(jù)庫(kù)、表、用戶,以及導(dǎo)入數(shù)據(jù)等。
具體來(lái)說(shuō),docker-entrypoint-initdb.d
目錄下的文件執(zhí)行有以下特點(diǎn):
- 執(zhí)行順序通常是按文件名排序。
- 支持
.sh
腳本(可執(zhí)行權(quán)限)和 SQL 腳本(.sql
)。 - 這些腳本只在容器的 MySQL 數(shù)據(jù)卷為空時(shí)運(yùn)行,即首次啟動(dòng)時(shí)。如果數(shù)據(jù)卷已有數(shù)據(jù)(例如容器重啟),這些初始化腳本不會(huì)再次執(zhí)行,以防止數(shù)據(jù)被重復(fù)初始化覆蓋。
利用這個(gè)機(jī)制,開(kāi)發(fā)者可以通過(guò) Dockerfile 或者在運(yùn)行容器時(shí)通過(guò) -v
選項(xiàng)掛載包含初始化腳本的本地目錄到 docker-entrypoint-initdb.d
,從而實(shí)現(xiàn) MySQL 容器的自動(dòng)化配置和數(shù)據(jù)初始化。
docker-entrypoint-initdb.d下的sql腳本在啟動(dòng)docker時(shí)沒(méi)有執(zhí)行原因
docker鏡像啟動(dòng)時(shí)會(huì)執(zhí)行entrypoint.sh腳本;
其中關(guān)于是否執(zhí)行數(shù)據(jù)庫(kù)初始化的核心代碼如下:
由腳本可以看出,對(duì)于docker-entrypoint-initdb.d 目錄下的sql 文件,在執(zhí)行前會(huì)判斷 DATABASE_ALREADY_EXISTS 是否為false
即 $DATADIR/mysql 目錄并不存在;
但凡該服務(wù)器已經(jīng)存在任何數(shù)據(jù)庫(kù),那么這個(gè)文件肯定不為空,故而不會(huì)執(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker自定義安裝更改默認(rèn)安裝位置簡(jiǎn)單方法
安裝Docker的過(guò)程相對(duì)簡(jiǎn)單,你只需要雙擊下載的安裝程序并按照提示進(jìn)行安裝即可。在安裝過(guò)程中,你可以選擇自定義安裝選項(xiàng),這篇文章主要給大家介紹了關(guān)于Docker自定義安裝更改默認(rèn)安裝位置的簡(jiǎn)單方法,需要的朋友可以參考下2024-01-01docker-compose+nginx部署前后端分離的項(xiàng)目實(shí)踐
本文主要介紹了docker-compose?+?nginx部署前后端分離的項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Docker安裝RabbitMQ AMQP協(xié)議及重要角色
這篇文章主要為大家介紹了Docker安裝RabbitMQ AMQP協(xié)議和主要角色詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Docker中Dockerfile之容器中運(yùn)行MyEclipse搭建的JavaWeb項(xiàng)目
本篇文章主要介紹了Docker中Dockerfile之容器中運(yùn)行MyEclipse搭建的JavaWeb項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02