2016-04-11 7 views
2

私はドッカーコンテナの中でpostgresqlを実行しています。私のシステムは、1回のセットアップとランタイムという2つの部分に分かれています。 1時間のセットアップを実行している場合は、私が入力したユーザー名、パスワード、およびDBNAMEを、ユーザーを取得し、それらの名前を持つスーパーユーザとデータベースを作成します。ドッカーファイルを取得して環境変数を評価するにはどうすればいいですか?

docker run -e USERNAME=user -e PASSWORD=admin -e DBNAME=test myImage 

はここでドッキングウィンドウのファイルdockerfileからの抜粋です:

RUN /etc/init.d/postgresql start && psql --command "CREATE USER $USERNAME WITH SUPERUSER PASSWORD '$PASSWORD';" && createdb -O $USERNAME $DBNAME 

私はこのすべてを定数のユーザー名、パスワード、およびデータベース名でテストしましたが、周囲の環境変数を渡そうとすると動作しないようです。環境変数がdockerfileによって拡張されていないと述べた記事を先に読んだと思いますが、環境変数がこの情報をdockerに渡す最善の方法であるという矛盾した情報も聞いてきました。

上記のスニペットを機能させるにはどうすればよいですか?ドッカーに環境変数を評価させるために誤った構文を使用していますか?

実行中のコンテナを調べて、環境変数が正しく設定されていることを確認しました。

答えて

2

Dockerfileで実行されていることを誤解していると思います。多分あなたはそれを "ドッカーラン"と混同します。代わりにCMDを見てください。

注:Dockerfileの目的はイメージを作成することです。コンテナは、イメージから「ドッカーラン」コマンドによって作成されるプロセスです。

コンテナを作成するときにコマンドを実行する場合は、「ドッカー実行」の引数として、DockerfileのCMDとして、またはいずれかの場所のエントリポイントとして指定できます。

+0

ありがとう、私はいくつかのチュートリアルを見てきましたが、それを少し良く理解していますが、さらに関連する質問があります。この特定のイメージでは、すべてのインストールで同じように実行する必要があるので、ENTRYPOINTを使用する必要がありますが、3つのコマンドを順番に実行したい(開始、スーパーユーザー作成、createdb)。これをどのように指定するのですか?チュートリアルでは、複数のエントリポイントがある場合は、最後のエントリポイントのみが使用されると述べています。 – Andy

+0

イメージにシェルスクリプトを追加できます。それ以外の場合は、セミコロンで区切ってコマンドを1つのライナーにまとめることができます。 – ateles

+0

CMDとENTRYPOINTの違いを理解するには、https://hub.docker.com/r/k3ck3c/nethogs/をご覧ください。実行するとwlan0を監視し、ra1を監視する場合はra1を追加します'docker run'コマンドの最後に、3つのコマンドを実行するために' command1; command2; command3' – user2915097

関連する問題