Docker run コマンドを使用して Dockerfile の CMD に引数を渡す
質問
私は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フォームを使用してシェルを直接実行する場合、シェルフォームの場合のように、環境変数の展開を行うのはシェルであり、ドッカーではありません。
関連
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】Dockerのビルドコンテキスト外のファイルをインクルードする方法とは?
-
[解決済み] ReferenceError: describe は定義されていません NodeJs
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] DockerfileのCMDとENTRYPOINTの違いは何ですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] Dockerでイメージのクリーンビルドを強制する方法
-
[解決済み] Dockerコンテナに環境変数を渡すにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AWS STS AssumeRoleへのアクセスを可能にする方法
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】モジュール 'internal/util/types' が見つかりません。
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] nodejsでfindAllのソート順を続編にする
-
[解決済み] バルク更新を行う。
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] Express.js req.bodyが未定義です。
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?