2017-02-08 7 views
9

私は、開発者のプロセスをドッカーを使用して簡単にしたりメンテナンスしたりしようとしています(-compose)。 ボリュームを使用したくない場合(可能な場合) 'docker-compose up -d'を実行した後にimport.shが実行されないのはなぜですか?ドッカーの作成後にスクリプトを実行する方法は?

私は、次のファイルがありますがあり/mysqlの/ Dockerfile

version: '2' 

services: 
    database: 
    image: mysql 
    build: 
     context: ./mysql/ 
     dockerfile: Dockerfile 
    container_name: mysqltest 
    ports: 
     - "3306:3306" 
    environment: 
     MYSQL_ROOT_PASSWORD: 123456 

ADD import.sh /tmp/import.sh 
ADD db.sql /tmp/db.sql 
RUN /tmp/import.sh 
あり ドッキングウィンドウ-compose.yml

docker-compose.yml 
    mysql 
    ---- import.sh 
    ---- db.sql 
    ---- Dockerfile 

in /mysql/db.sqlがあります:

CREATE DATABASE test1; 
CREATE DATABASE test2; 
CREATE DATABASE test3; 
+0

画像が_built_のときにDockerファイルが実行されます。 Docker Composeは、実行する前に画像を作成します。だからあなたのスクリプトは_after_ではなく、 'docker-compose up -d'を実行する前に実行していなければなりません。 – mkasberg

+2

mysqlデーモンが起動してからデータベースダンプを実行したいと思うようです。その場合は、[MySQL Dockerhub Page](https://hub.docker.com/_/mysql/)で文書化されている '/ docker-entrypoint-initdb.d'を使用し、ここで説明します:http:// stackoverflow .com/questions/36781984/load-postgres-dump-after-docker-compose-up/36782751#36782751(PostgresとMySQLで同じ機能をします) – mkasberg

+1

はい、それは私が達成したいものです。それは私のために働いてくれました。ありがとうございます。しかし、ビルドプロセスの後、またはすべてのコンテナが準備完了した後に、他のスクリプトを実行したい場合はどうすればよいでしょうか? – p0rter

答えて

8

あなたはコンテナの起動時のコマンドを実行するために、あなたのDockerfileにENTRYPOINTまたはCMDを使用することができます。それらの違いは、コンテナが開始されるといつでもENTRYPOINTが実行され、CMDはコマンドラインオプションに置き換えられる可能性があるということです。あなたが実行したいコマンドを仮定するとENTRYPOINT XはDockerfileにあったとYCMD X場合Dockerfileにあった場合X

docker run my-image Y 

Xを実行しますです。

しかし、2つの注意点があります。

  1. コマンドは、コンテナが起動されるたびに実行されますが。
  2. コマンドが終了すると、コンテナがシャットダウンします。

したがって、典型的な解決策は、docker-entrypointスクリプトを持つことです。環境を開始する新しいコンテナで実行されているかどうかをチェックし、その後コンテナの実際のプログラムを実行します。 アイデアを得るにはofficial mysql Dockerfile and entrypointをご覧ください。

例のエントリポイントスクリプトは次のようになります。

$ cat docker_entrypoint.sh                                   
if [ ! -f .initialized ]; then                                              
    echo "Initializing container"                                             
    # run initializing commands                                             
    touch .initialized                                                
fi                                                     

exec "[email protected]" 

まず、それは.initializedというファイルがあるかどうかをチェックします。存在しない場合は、いくつかのコマンドを実行してコンテナ環境を初期化します。その後、touch .initializedは空のファイルとして.initializedを作成します。したがって、その後のコンテナの起動では、初期化コマンドは再度実行されません。 第2に、実際のサービスを開始します。 execでこれを行うと、シェルプロセスがサービスのプロセスに置き換えられます。したがって、ドッカーは、サービスが終了するまでコンテナを実行し続けます。 "[email protected]"には "container/imageコマンド"が含まれます。これはDockerfileにCMD Xで設定されており、既に上で指摘したようにコマンドでオーバーライドされています。 exec "[email protected]"を使用すると、検査のためにコンテナ内のさまざまなプログラムを起動することができます。 bashを開き、DockerfileのCMDステートメントで指定されているように、デフォルトでサービスを開始します。

関連する問題