2016-05-26 11 views
13

Dockerと仕事をするのは初めてです。私がうまくやっているかどうかはわかりません。Docker、イメージ内の.sqlファイルを実行するには?

私はMySQLのデータベースに依存して、レールのアプリケーションを持っているので、私はこのようなdocker-compose.ymlファイル設定した:私は次のことを実行した場合、その後

db: 
    image: library/mysql:5.6 
    environment: 
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes" 
    expose: 
    - "3306" 
    ports: 
    - "3306:3306" 

rails-app: 
    build: . 
    dockerfile: Dockerfile 
    environment: 
    RAILS_ENV: development 
    links: 
    - db 
    volumes: 
    - ".:/home/app" 
    volumes_from: 
    - bundle 

    ... omitted lines ... 

を:

$ docker-compose run db mysql --host=$DOCKER_LOCALHOST --port=3306 --protocol=tcp -u root < shared/create_common_tables.sql 

このエラーが発生します:

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.99.100' (111) 

このsouなぜなら、dbにリンクするいくつかのコンテナの前に私はbuildを持っていなければならないと思うからです。

私はこの順序でこれを実行する場合ので、私はこれを知っている:

$ docker-compose build rails-app 
$ docker-compose run -e RAILS_ENV=development rails-app bundle 
$ docker-compose run -e RAILS_ENV=development rails-app bundle exec rake db:create 
$ docker-compose run db mysql --host=$DOCKER_LOCALHOST --port=3306 --protocol=tcp -u root < shared/create_common_tables.sql 

それは正常に動作します。

ただし、コンテナを作成する前にこのsqlを実行するにはどうすればよいですか?

答えて

7

イメージのbuildフェーズでSQLファイルをロードできます。これを行うには、次のようになりますDockerfileためdbサービスを作成します。

#!/bin/bash 
set -e 
service mysql start 
mysql < /mysql/setup.sql 
service mysql stop 

そして、あなたの中

docker-compose.ymlあなたが image build: ./dbをに変更したい: setup.shは次のようになります

FROM mysql:5.6 
COPY setup.sh /mysql/setup.sh 
COPY setup.sql /mysql/setup.sql 
RUN /mysql/setup.sh 

またはファイルを置くパスを指定します。

すべてのsqlを未加工の.sqlファイルに保存している場合、これはうまく動作しますが、実際にコードがSQLに格納されているレールや同様のフレームワークを使用している場合はこれが当てはまりません。これには2つのオプションがあります。

  1. の代わりにあなたがFROM your_app_image_that_has_the_code_in_itapt-get install mysql ...を使用することができますFROM mysql:5.6を使用。これにより、上記のrubyコマンドを実行できるように、mysqlとアプリケーションの両方を含むより大きなイメージが残されます。 mysql < /mysql/setup/sqlrails-app bundle exec rake db:create行に置き換えます。また、代わりのdb:3306

  2. マイ好ましい選択肢は、あなたが、あなたのデータベースを構築するために使用することができます.sqlファイル、にSQLをエクスポートするスクリプトを作成することですlocalhost:3306上のデータベースをヒットアプリの設定を提供する必要があると思いますコンテナ。これはもう少し作業ですが、もっと良いです。つまり、rails-app bundle exec rake db:createを実行する代わりに、スクリプトを実行してdbをロードするだけです。

このようなスクリプトは次のようなものになります。場合

#!/bin/bash 
set -e 
RAILS_ENV=development 
rails-app bundle exec rake db:create 
mysqldump > /output/setup.sql 

あなたはまた、第二コンファイルでdocker runスクリプトを置き換えることができます:export.shは次のようになります

#!/bin/bash 
set -e 
docker-compose build rails-app 
docker run -d --name mysql_empty mysql:5.6 
docker run --link mysql_empty:db -v $PWD:/output project_rails-app export.sh 

をあなたが望みました。

+3

MySQLドッカーイメージには、新しいコンテナをデータで初期化するメカニズムが既に用意されています。 /docker-entrypoint-initdb.dからすべての.shと.sqlファイルをロードするだけで、COPYまたはホストからそのディレクトリへのマウントが必要です。 「新しいインスタンスの初期化」のhttps://hub.docker.com/_/mysql/を参照してください。 – diwo

+3

はい、そのメカニズムは、「作成する前にこのSQLを実行するにはどうすればよいですか?コンテナ"。個人的には、エントリーポイントの一部としての装備品のローディングは良い解決策だとは思わない。コンテナを作成するたびにプロセスを繰り返す必要があるため、起動時間が大幅に遅くなります。 – dnephin

関連する問題