Docker-composeで.sqlダンプファイルをインポートするのに問題があります。私はドキュメントに従いましたが、どうやらdocker-entrypoint-initdb.dから.sqlファイルをロードするようです。ただし、docker-compose up
を実行すると、sqlファイルはコンテナーにコピーされません。
-vf
フラグを使用してコンテナを停止しようとしましたが、それも機能しませんでした。 .ymlスクリプトで何か間違ったことをしていますか?
構成ファイルがあるルートのdatabase/db-dump /ディレクトリにdump.sqlがあります。
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
volumes:
- ./database/db-dump:/docker-entrypoint-initdb.d
ボリューム設定で何度も試行した後、回避策が見つかりました
Dockerfileに以下を含むmysqlに基づく別のイメージを作成しました
FROM mysql:5.6
ADD dump.sql /docker-entrypoint-initdb.d
次に、ボリュームを構成から削除し、新しいイメージを実行しました
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mymysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
この方法で、ダンプは常にコピーされ、起動時に実行されます
これは私のために働いた、
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: ecommerce
adminer:
image: adminer
restart: always
ports:
- 8080:8080
mysql-dumpはディレクトリでなければなりません。ディレクトリ内のすべての.sqlがインポートされます。
これは、Docker MySQLイメージのドキュメントページに表示されます。 https://hub.docker.com/_/mysql/
新しいインスタンスの初期化
コンテナが初めて起動されると、指定された名前の新しいデータベースが作成され、指定された構成変数で初期化されます。さらに、/ docker-entrypoint-initdb.dにある拡張子
.sh
、.sql
および.sql.gz
を持つファイルを実行します。ファイルはアルファベット順に実行されます。 SQLダンプをそのディレクトリにマウントする でmysqlサービスを簡単に設定し、提供されたデータで カスタムイメージ を提供できます。 SQLファイルは、デフォルトでMYSQL_DATABASE
変数で指定されたデータベースにインポートされます。
Mysqlデータベースダンプschema.sqlは/ mysql-dump/schema.sqlディレクトリにあり、初期化プロセス中にテーブルを作成します。
docker-compose.yml:
mysql:
image: mysql:5.7
command: mysqld --user=root
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
私はmysqlで同様の問題を抱えていました。そこでは、docker-composeを介してmydatabasedump.sqlファイルを含むローカルディレクトリを/ configs/mysql/dataにマウントし、docker-entrypoint-initdb.dボリュームにファイルをロードしましたコンテナは初期化されますが、コンテナは実行されませんが、データベースは実行されません。私の最初のdocker-compose.ymlは次のようになります。
#docker-compose.yml
version: '3'
services:
db:
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d:
この問題に対する2つの有効なソリューションを見つけました。
1つ目は、実行中のコンテナにログインして、mydatabasedump.sqファイルがコンテナのdocker-entrypoint-initdb.dディレクトリに存在し、実行可能であることを確認した後のものです。コンテナの初期化後に実行されたdump.shというローカルの/ configs/mysql/dataディレクトリにbashスクリプトを作成して追加しました。 my_database_dump.sqlをmy_app_databaseにコピーする単一のmysqlコマンドが含まれています。 bashスクリプトは次のようになります
#!/bin/bash
#dump.sh
mysql -uadmin -padmin my_app_database < my_database_dump.sql
#end of dump.sh
このスクリプトは、次のようにENTRYPOINTディレクティブでDockerfileを介して実行しました。
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dokerfile
最初の問題を認識した後、コテイナーが構築された後にボリュームが削除されたため、起動時にデータベースにダンプファイルを組み込み(またはそのディレクトリ内のスクリプトを実行しなかった)、2番目の解決策は単にボリュームディレクティブを移動することでした作成したディレクティブの上の私の作成ファイルで。これにより、Dockerfileのdump.shスクリプトとDOCKERENTRYディレクティブを削除できました。変更されたdocker-compose.ymlは次のようになります
#docker-compose.yml
version: '3'
services:
db:
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin