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


101

私のDockerfile内:

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

エラー:

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

ここで最も迅速な回避策は何ですか?Dockerには、今後のバージョンのDockerでこの機能を「修正」または導入する予定はありますか?

注:DockerファイルからCMD行を削除してからDockerコンテナーを実行すると、コンテナー内からDjango-admin startproject $ PROJECTNAMEを手動で実行でき、プロジェクトが作成されます...


1
いつ、どのように定義してい$PROJECTNAMEますか?
Piotr Wittchen 2016年

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

どのような種類の変数を意味します:dockerfile変数または環境変数(システムランタイムなど)?
emix

回答:


159

次のように実行リストを使用すると...

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

...その後、Dockerはシェルを使用せずに、指定されたコマンドを直接実行します。シェルが含まれていないため、これは次のことを意味します。

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

あなたがしたい場合はCMD、変数を展開するには、シェルの手配をする必要があります。あなたはこのようにそれを行うことができます:

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

または、実行リストの代わりに単純な文字列を使用して、前の例とほぼ同じ結果を取得できます。

CMD django-admin startproject $PROJECTNAME

2
Dockerの課題追跡でさらに読む:github.com/docker/docker/issues/5509
jannis

@larsksの単純な文字列は
すばらしい

あなたは私の日を救った!
スープラティムロイ

18

実行時に値を使用する場合は、で値を設定しENVますDockerfile。ビルド時に使用する場合は、を使用する必要がありますARG

例:

ARG value
ENV envValue=$value
CMD ["sh", "-c", "java -jar ${envValue}.jar"]

ビルドコマンドに値を渡します。

docker build -t tagName --build-arg value="jarName"

10

コンテナー内でJavaプロセスを開始したいとしましょう:

Dockerfileの抜粋の例:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["java", "${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 "$@")

0

上記に触発されて、私はこれをしました:

#snapshot by default. 1 is release.
ENV isTagAndRelease=0

CMD     echo is_tag: ${isTagAndRelease} && \
        if [ ${isTagAndRelease} -eq 1 ]; then echo "release build"; mvn -B release:clean release:prepare release:perform; fi && \
        if [ ${isTagAndRelease} -ne 1 ]; then echo "snapshot build"; mvn clean install; fi && \ 
       .....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.