ENTRYPOINT配列でDocker環境変数を使用するにはどうすればよいですか?


109

たとえば、環境変数を設定し、ENV ADDRESSEE=worldそれを次のような固定文字列に連結されたエントリポイントスクリプトで使用したい場合は、

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

world環境varibleの値である、私はそれをどのように行うのですか?使ってみ"Hello, $ADDRESSEE"ましたが、$ADDRESSEE文字通りかかるのでうまくいきません。

回答:


216

ENTRYPOINT のexec形式を使用しています。異なり、シェル形幹部の形式は、コマンドシェルを起動しません。つまり、通常のシェル処理は行われません。たとえば、ENTRYPOINT [ "echo", "$HOME" ]$ HOMEで変数置換を行いません。シェル処理が必要な場合は、シェルフォームを使用するか、シェルを直接実行しますENTRYPOINT [ "sh", "-c", "echo $HOME" ]。次に例を示します。
シェルフォームの場合のように、execフォームを使用してシェルを直接実行する場合、dockerではなく、環境変数の展開を行っているのはシェルです(Dockerfileリファレンスから)

あなたの場合、私はシェルフォームを使用します

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portながらENV port=123。ポートENVは解決されません。なぜ何かアイデア?
xetra11 2017

1
動作している間は、そのエントリポイントに渡された引数が含まれていないなど、いくつかの新しい問題が発生するようです。たとえば--attitude "shouting"docker runコマンドに渡される引数を追加することはできません./greeting
Daniel F

5
呼び出しENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"./greeting介して追加の変数を渡したいdocker run(またはCMDDockerfileのを渡したい)場合にも使用します
Daniel F

3
シェル形式では、シグナルがプロセスに渡されない場合があることに注意してgreetingください(例では)。hynek.me/articles/docker-signals
jbg

`[myexecutable.sh、" $ variable "]のようなexec形式の環境変数の値を取得できますか?[" sh "、" -c "、" echo $ var "]で取得できますが、このように
ラザロ

13

私は提案された回答で解決しようとしましたが、それでもいくつかの問題が発生しました...

これは私の問題の解決策でした:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

問題を具体的に対象とする:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

あなたの答えはOPの質問の完全な解決策を提供していないようです
user9405863

私はそれがOPの質問の解決策を提供しない方法を理解していないと思います...正確な質問を念頭に置いて解決するために例を更新しました。
ベンカウフマン

あなたはまだあなたがいくつかの問題に遭遇したと述べました!!
user9405863

正しいので、私は新しいソリューションを導入しました。...「受け入れられた」答えは私にとってはうまくいかなかったので、私はシェルスクリプトにエコー出力し、それはうまくいきました。
ベンカウフマン

2
私は@ReverendTim;)であなたのアプローチを聞くことに興味があります;)
ベンカウフマン

6

多くの苦痛と、上記の@vitrらからの多大な支援を受けて、私は試すことにしました

  • 標準のbash置換
  • シェル形ENTRYPOINT(上から大きなチップ)

そしてそれはうまくいった。

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

例えば

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

そして

docker run --rm -p 8080:80 -d my-image

どちらも私のコンテナでポートを正しく設定しました

参照

https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.htmlを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.