MySQL容器中docker-entrypoint-initdb.d目錄的使用
MySQL容器docker-entrypoint-initdb.d目錄
docker-entrypoint-initdb.d
是一個特殊的目錄,專用于 Docker 中的 MySQL 容器。
當(dāng)使用 Docker 運行 MySQL 容器時,如果這個目錄存在并且包含 SQL 腳本或其它可執(zhí)行文件,Docker 會在 MySQL 服務(wù)啟動之初自動執(zhí)行這些腳本。
這一機制使得在首次啟動容器時能夠方便地進行一些初始化設(shè)置,比如創(chuàng)建數(shù)據(jù)庫、表、用戶,以及導(dǎo)入數(shù)據(jù)等。
具體來說,docker-entrypoint-initdb.d
目錄下的文件執(zhí)行有以下特點:
- 執(zhí)行順序通常是按文件名排序。
- 支持
.sh
腳本(可執(zhí)行權(quán)限)和 SQL 腳本(.sql
)。 - 這些腳本只在容器的 MySQL 數(shù)據(jù)卷為空時運行,即首次啟動時。如果數(shù)據(jù)卷已有數(shù)據(jù)(例如容器重啟),這些初始化腳本不會再次執(zhí)行,以防止數(shù)據(jù)被重復(fù)初始化覆蓋。
利用這個機制,開發(fā)者可以通過 Dockerfile 或者在運行容器時通過 -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-03Docker安裝RabbitMQ AMQP協(xié)議及重要角色
這篇文章主要為大家介紹了Docker安裝RabbitMQ AMQP協(xié)議和主要角色詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Docker中Dockerfile之容器中運行MyEclipse搭建的JavaWeb項目
本篇文章主要介紹了Docker中Dockerfile之容器中運行MyEclipse搭建的JavaWeb項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02