2016-11-06 9 views
12

Dockerfile CMD内で変数を使用するにはどうすればよいですか?私Dockerfileインサイド

ENV PROJECTNAME mytestwebsite 
CMD ["django-admin", "startproject", "$PROJECTNAME"] 

エラー:

CommandError: '$PROJECTNAME' is not a valid project name 

ここ最速の回避策は何ですか? Dockerは、Dockerの後のバージョンでこの機能を "修正"または導入する計画はありますか?

注:私はドッカーファイルからCMDラインを削除してから、ドッカーコンテナを実行する場合、私は手動でコンテナ内部からDjangoの管理者startprojectの$ PROJECTNAMEを実行すると、それがプロジェクトを作成しますことができるよ...

あなたが実行リストを使用する場合
+1

どのように、あなたは '$ PROJECTNAME'を定義していますか? –

+0

ENVを使用しているDockerfileの冒頭にあります。また、DockerfileからCMD行を削除してからコンテナを実行すると、このコマンドを実行でき、プロジェクトが作成される(ENV変数が有効であることを意味する)ということを忘れてしまいました。 – david

+0

dockerfile変数または環境変数(システムランタイムのような)のどのタイプの変数ですか? –

答えて

18

は、中...

CMD ["django-admin", "startproject", "$PROJECTNAME"] 

として...その後ドッカーは、シェルを介さず、直接を与えられたコマンドを実行します。関与しないシェルがないので、それが意味する:

  • いいえ可変膨張
  • ワイルドカード拡張
  • など>とは、I/Oリダイレクション、<|
  • なし複数のコマンドcommand1; command2
  • を介し
  • など。

CMDに変数を展開する場合は、シェルを配置する必要があります。

CMD ["sh", "-c", "django-admin startproject $PROJECTNAME"] 

それとも、あなたの前の例とほぼ同じ結果を得る代わりに、実行リストの単純な文字列を、使用することができます:

CMD django-admin startproject $PROJECTNAME 
+0

を更新しました。Dockerの問題追跡ツールでもう少し読むことができます:https://github.com/docker/docker/issues/5509 – jannis

+0

"c"の後にカンマがありません。 – Ako

+0

@ako、おかげで、固定。 – larsks

1

したいとしましょうあなたはこのようなことを行うことができますコンテナ内でJavaプロセスを開始する。この場合、さらにオプションが必要で、プロセスを直接開始したいとします(たとえば、Tomcatの場合はcatalina.shラッパーなし)。まず、catalina.shラッパーを使用してプロセスを開始します。次に、コンテナの内側に、ps ef | lessを使ってプロセスの実行文を取得します。オプションとコマンドセクションを細分化し、これを新しいCMDにします。

例Dockerfileの抜粋:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["myprocess", "${JAVA_OPTS}", "-myargument=true"] 

例entrypoint.sh抜粋:

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***" 
exec su-exec mytechuser $(eval echo "[email protected]") 
関連する問題