2017-12-14 4 views
0

私はMariaDBを使用していますが、これはおそらくMySQLにも当てはまると思います。スクリプトで初期ビルド時にドッキングされたmariadbにインポートする

私はMariaDBで動作するプロジェクトを持っています。テーブルの作成、初期データの挿入などのためにデータベースの初期設定がいくつかあります。他の回答に基づいて通常はADD dump.sql /docker-entrypoint-initdb.d私はdump.sqlを持っていません - 代わりに私はMariaDBに直接接続し、テーブルとデータを作成するpythonスクリプトです。私はちょうどdb作業を取得したいので、

私はドッキングウィンドウ-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 

「ウェブ」を持っているが、今それほど重要ではありません。

私は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"] 

しかし、これは様々な理由のために動作しません。私はこれがmysql-pythonのインストールに関係していると思います

_mysql.c:2005:41: error: 'MYSQL' has no member named 'reconnect' 

    if (reconnect != -1) self->connection.reconnect = reconnect; 

:私はpip install mysql-pythonがコンパイルできない時点までに得ています。

私が穴をあまりにも遠くにする前に、私は./pricing_import.pyスクリプトを取得してからデータベースが起動されると思っていないし、接続しようとしているからデータベースとクエリを実行すると、おそらく動作しません。

私はPythonのインストールはとにかくmariadbコンテナ上で動作するように得ることができないので、私はまたdbに依存し、docker-compose build中に最初のインポートを行うには、ビルドにPythonスクリプトを実行する別のdocker-composeエントリを作成することを考えていました。

これらのアプローチのどちらかが正しいか、MariaDBに対して初期化スクリプトを実行するより良い方法がありますか?

答えて

1

docker-composehealthcheckを使用して、makefilebashの組み合わせで初期化スクリプトの実行を処理します。だからあなたのドッキングウィンドウ-compose.ymlは、次のようになります。

./database/my.cnfは、資格情報を使用して設定され
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 

[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 

make startでアプリを起動してください。

+0

いいえ。 'docker-compose'をデータベースにロードすることと' make'を使ってこれを別々に行います。 –

+0

はい、問題は、 'docker-compose up'を呼び出すときにデータベースを起動してデータをロードするまで待たなければならないということです。 。 – zstate

関連する問題