使用脚本在初始构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另一个依赖于db
的mariadb
docker-compose
条目,并在构build时运行python脚本以在docker-compose build
期间执行初始导入。
这些方法是否正确,还是有更好的方法来处理对MariaDB运行初始化脚本?
我们使用docker-compose
healthcheck与makefile
和bash
组合来处理运行初始化脚本。 所以你的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
然后启动你的应用程序。