1. ホーム
  2. node.js

Docker run コマンドを使用して Dockerfile の CMD に引数を渡す

2023-12-04 20:27:31

質問

私はDockerの初心者なのですが、Dockerコンテナを思い通りにセットアップするのに苦労しています。私は、起動時に2つのパラメータを取ることができるnodejsアプリを持っています。例えば、私は使用することができます

node server.js 0 dev

または

node server.js 1 prod

で、本番モードと開発モードを切り替えて、クラスタをオンにするかどうかを判断しています。さて、同じようなことをするために引数付きのDockerイメージを作りたいのですが、今のところできることはDockerfileに

CMD [ "node", "server.js", "0", "dev"]

そして

docker build -t me/app . でdockerをビルドします。

次に docker run -p 9000:9000 -d me/app でdockerを実行します。

しかし、prodモードに切り替えたい場合は、DockerfileのCMDを次のように変更する必要があります。

CMD [ "node", "server.js", "1", "prod"] ,

で、ポート9000でリッスンしている古いものを殺して、イメージを再構築する必要があります。 私は、次のようなものがあればいいなと思います。

docker run -p 9000:9000 environment=dev cluster=0 -d me/app

でイメージを作成し、"environment" と "cluster" を引数として nodejs コマンドを実行すれば、Dockerfile を変更したり docker を再構築する必要はなくなるのでしょうか?どうすれば実現できるのでしょうか?

どのように解決するのでしょうか?

Dockerfile で環境変数が宣言されていることを確認します。 ENV :

ENV environment default_env_value
ENV cluster default_cluster_value

ENV <key> <value> の形式は に置き換えることができます。 .

次に に環境変数を渡すと、Docker Run . それぞれの変数には、特定の -e フラグが必要であることに注意してください。

docker run -p 9000:9000 -e environment=dev -e cluster=0 -d me/app

または で設定することもできます。 :

node:
  environment:
    - environment=dev
    - cluster=0

あなたのDockerfile CMD はその環境変数を使用することができます。 問題 5509 で述べたように、この環境変数を使うには sh -c という形式にしてください。

CMD ["sh", "-c", "node server.js ${cluster} ${environment}"]

説明すると、環境変数の展開はDockerではなくシェルが行っています。を使用すると JSON構文 を使用すると、コマンドがシェルをバイパスして直接実行されるように明示的に要求していることになります。

同じ考えで ビルダーラン (に適用されます。 CMD も同様)。

シェルフォームとは異なり、execフォームはコマンドシェルを起動しません。

つまり、通常のシェル処理は行われません。

例えば RUN [ "echo", "$HOME" ] では変数置換を行わず $HOME . もしシェル処理が必要なら、シェルフォームを使うか、直接シェルを実行します。 RUN [ "sh", "-c", "echo $HOME" ] .

<ブロッククオート

execフォームを使用してシェルを直接実行する場合、シェルフォームの場合のように、環境変数の展開を行うのはシェルであり、ドッカーではありません。