web-dev-qa-db-ja.com

CMDで環境変数を使用する

DockerfileのCMDスタンザで環境変数を使用できますか?

私はこのようなことをしたい:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

$ MEMCACHE_11211_TCP_ *は、docker runコマンドの--linkパラメーターを含めることで自動的に設定されます。また、$ ARGは、実行時にユーザーが設定できるようになります。「-e」パラメーターが設定されますか?

これは私には機能していないようです。たとえば、文字列「$ ARG」を文字通り通り抜けているようです。

71
brooks94

この答えは少し遅いかもしれません。ただし、CMDの環境は、引数の記述方法によってわずかに異なる解釈になります。 CMDを(配列内ではなく)文字列として渡すと、execの代わりにシェルとして起動されます。 https://docs.docker.com/engine/reference/builder/#cmd を参照してください。

シェルとして実行するには、配列構文なしでCMDを試してください:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT
46
Andy Shinn
CMD ["sh", "-c", "echo ${MY_HOME}"]

Sffitsからの回答 here

21
Alex Punnen

両方のアンディはそれを正しかった。 json構文はエントリポイントをバイパスします。例のようにCMDを使用すると、デフォルトのエントリポイントへの引数と見なされます:/bin/sh -cこれは環境変数を解釈します。

いずれの場合も、DockerはCMDの変数を評価しません。前者では、コマンドは直接呼び出されるため、何も解釈されません。後者では、変数はshによって解釈されます。

11
creack

想定動作する方法について話すことはできませんが、これをシェルスクリプトとして呼び出した場合、たとえばCMD runmyserver.sh、その後、シェル変数の解釈は、CMDが実際に実行されるまで延期されます。

だから、試してください

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

シェルスクリプトとして?

7
Andy