使用脚本在初始构build时导入到dockerized mariadb中

我正在使用MariaDB,但我认为这也可能适用于MySQL。

我有一个项目,MariaDB的工作,并有一些初始设置的数据库,需要做到创build表,插入初始数据等。基于其他答案,我通常可以做ADD dump.sql /docker-entrypoint-initdb.d ,但我没有dump.sql – 而是我有一个python脚本直接连接到MariaDB并创build表和数据。

我有一个docker-compose.yml

 version: '3' services: db: build: ./db ports: - "3306:3306" container_name: db environment: - MYSQL_ROOT_PASSWORD=root web: build: ./web command: node /app/src/index.js ports: - "3000:3000" links: - db 

“networking”现在不是那么重要,因为我只是想让db工作。

我尝试过的数据库的Dockerfile是:

 # db/Dockerfile FROM mariadb:10.3.2 RUN apt-get update && apt-get install -y python python-pip python-dev libmariadbclient-dev RUN pip install requests mysql-python ADD pricing_import.py /scripts/ RUN ["/bin/sh", "-c", "python /scripts/pricing_import.py"] 

但是这不能用于各种原因。 我已经到了pip install mysql-python不能编译的地步:

 _mysql.c:2005:41: error: 'MYSQL' has no member named 'reconnect' if ( reconnect != -1 ) self->connection.reconnect = reconnect; 

我认为这与mysql-python的安装有关。

然而,在我深入研究这个问题之前,我想确保我的方法更具有./pricing_import.py ,因为我甚至不认为数据库在启动./pricing_import.py脚本后就会启动,并且因为它试图连接到数据库并运行查询,它可能不会工作。

由于我无法让python安装在mariadb容器上工作,我还在考虑创build另一个依赖于dbmariadb docker-compose条目,并在构build时运行python脚本以在docker-compose build期间执行初始导入。

这些方法是否正确,还是有更好的方法来处理对MariaDB运行初始化脚本?

我们使用docker-compose healthcheck与makefilebash组合来处理运行初始化脚本。 所以你的docker-compose.yml会是这样的:

 version: '3' services: db: build: ./db ports: - "3306:3306" container_name: db environment: - MYSQL_ROOT_PASSWORD=root healthcheck: test: mysqlshow --defaults-extra-file=./database/my.cnf interval: 5s timeout: 60s 

其中./database/my.cnf是具有凭证的configuration:

 [client] host = db user = root password = password 

那么你可以使用这个health-check.bash脚本来检查健康状况:

 #!/usr/bin/env bash DATABASE_DOCKER_CONTAINER=$1 # Check on health database server before continuing function get_service_health { # https://gist.github.com/mixja/1ed1314525ba4a04807303dad229f2e1 docker inspect -f '{{if .State.Running}}{{ .State.Health.Status }}{{end}}' $DATABASE_DOCKER_CONTAINER } until [[ $(get_service_health) != starting ]]; do echo "database: ... Waiting on database Docker Instance to Start"; sleep 5; done; # Instance has finished starting, will be unhealthy until database finishes startup MYSQL_HEALTH_CHECK_ATTEMPTS=12 until [[ $(get_service_health) == healthy ]]; do echo "database: ... Waiting on database service" sleep 5 if [[ $MYSQL_HEALTH_CHECK_ATTEMPTS == 0 ]]; then echo $DATABASE_DOCKER_CONTAINER ' failed health check (not running or unhealthy) - ' $(get_service_mysql_health) exit 1 fi; MYSQL_HEALTH_CHECK_ATTEMPTS=$((MYSQL_HEALTH_CHECK_ATTEMPTS-1)) done; echo "Database is healthy" 

最后,你可以使用makefile将所有东西连接在一起。 类似的东西:

 docker-up: docker-compose up -d db-health-check: db/health-check.bash db load-database: docker run --rm --interactive --tty --network your_docker_network_name -v `pwd`:/application -w /application your_docker_db_image_name python /application/pricing_import.py start: docker-up db-health-check load-database 

然后启动你的应用程序。