web-dev-qa-db-ja.com

MySQLスキーマ/データベースを作成するためにdocker-composeを使用する

Mysqlデータベース/スキーマがまだ存在しない場合、作成しようとしています。

ここに私が試したものがあります:

docker-compose.yml

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
  command: "mysql -uroot -proot < createDB.sql"
  ports:
    - "3306:3306"

createDB.sql

CREATE DATABASE IF NOT EXISTS bignibou;

それは動作しません。スキーマが存在しない場合、スキーマを作成するためにdocker/docker-composeを使用する最良の方法は何でしょうか?

18
balteo

私はついに解決策の始まりを見つけました。

MySQLイメージは、環境変数、つまりMYSQL_DATABASEを取ります。この変数は、イメージの起動時にデータベースの名前でコンテナを初期化します。完全 ドキュメンテーション

または、以下の抜粋を読んでください:

MYSQL_DATABASE

この変数はオプションであり、イメージの起動時に作成されるデータベースの名前を指定できます。ユーザー/パスワードが提供された場合(以下を参照)、そのユーザーには、このデータベースへのスーパーユーザーアクセス(GRANT ALLに対応)が許可されます。

ここに私が思いついたものがあります:

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
   - MYSQL_DATABASE=bignibou
  ports:
    - "3306:3306"

デフォルトの照合を指定する方法が必要になりましたが、それは別の話です...

edit:デフォルトとは異なる照合を指定することに興味がある人のために、デフォルトの設定を上書きする別の設定ファイルを使用する手順を以下に示します。下記参照:

カスタムMySQL構成ファイルの使用MySQLスタートアップ構成は、ファイル/etc/mysql/my.cnfで指定され、そのファイルには、/ etc/mysql/conf.dディレクトリで見つかった.cnfで終わるすべてのファイルが含まれます。このディレクトリ内のファイル内の設定は、/ etc/mysql/my.cnf内の設定を増強または上書きします。カスタマイズされたMySQL構成を使用する場合、ホストマシンのディレクトリに代替構成ファイルを作成し、そのディレクトリの場所をmysqlコンテナ内の/etc/mysql/conf.dとしてマウントできます。

/my/custom/config-file.cnfがカスタム構成ファイルのパスと名前である場合、次のようにmysqlコンテナーを起動できます(このコマンドではカスタム構成ファイルのディレクトリパスのみが使用されることに注意してください)。

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql:tagこれにより、新しいコンテナーsome-mysqlが開始されます。インスタンスは、/ etc/mysql/my.cnfと/etc/mysql/conf.d/config-file.cnfのスタートアップ設定を組み合わせて使用​​し、後者の設定が優先されます。

23
balteo

データを失わないようにするには、ボリュームも使用してください。

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
        - mysql-db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: my_db_name
    ports:
        - "3307:3306"
volumes:
  mysql-db:
4
Codenator81

おそらくあなたがしようとしていることは、追加のスクリプトが必要です。そのため、事前に構築されたイメージを直接使用する代わりにイメージを構築するオプションがある場合、Dockerfileを使用し、最初にMySqlにスクリプトをインポートしてからサービス自体を実行するスクリプトファイルを使用する必要があります。

この答えを見てください: Docker-スキーマを使用してmysqlデータベースを初期化する

1
mohamnag

Docker-composeドキュメントから Define Servicesを参照 -イメージのビルドに使用するDockerfileを確認できます。したがって、mysqlイメージに基づいてDockerfileを作成し、標準のDockerfileコマンドを使用してその中にデータベースを作成できます。

0
Grasshopper

これは、将来誰かがここに着陸した場合に役立つかもしれません。実際の問題は、docker-composeファイル内の「コマンド」ステートメントのようです。コマンドが正常に終了すると、コンテナは破棄されます。このSQLスクリプトは、docker-composeが実行され、コンテナーが作成された後にのみ実行する必要があります。 docker-compose「コマンド」は、実際にコンテナでサービスを開始することです。この場合、コマンドを使用してmysqlサービスをオーバーライドします。

0
Dean Sha