15

ユーザーを設定し、現在のユーザーをエコーする小さなdockerファイルを作成して、それが機能していることを自分自身に証明しようとしています。私は多くのバリアントを試しましたが、ドキュメントにはあまり助けがありませんでした.

FROM ubuntu
USER daemon
# ENTRYPOINT ["echo", "$USER"]
# just gives "$USER"
# ENTRYPOINT ["echo", "-e", "${USER}"]
# just gives "$USER"
# ENTRYPOINT echo $USER
# gives empty string
# ENTRYPOINT ["/bin/echo", "$USER"]
# just gives "$USER"

私はdocker build .dockerfileで実行してから実行しdocker run <image-id>て結果を取得しています

期待される結果はdaemon、または行がない場合はUSER daemonと予想されrootます。おそらく本当に簡単な答えです。

4

3 に答える 3

18

これは奇妙に思えるかもしれませんが、予期される動作です。

ENTRYPOINTがリストの場合( のようにENTRYPOINT ["echo", "$USER"])、それ以上の解析や解釈を行わずにそのまま使用されます。それを環境変数の値に置き換えるプロセスに関与するシェルがないため、そのまま$USERです。$USERUSER

ここで、ENTRYPOINTが文字列 ( のようにENTRYPOINT echo $USER) の場合、実際に実行されるのはsh -c "echo $USER"であり$USER、環境変数の値に置き換えられます (ご想像のとおり)。

ただし、環境変数USERはデフォルトでは設定されていません。ログインプロセスによって設定されます。ログインプロセスを実行するだけでsh -c ...は関与しません。

docker run -t -i ubuntu bashとの実行時の環境を比較しますdocker run -t -i ubuntu login -f root。前者の場合、非常に基本的な環境が得られます。後者の場合、使い慣れた完全な環境 (USER変数を含む) が得られます。

于 2013-11-11T14:39:47.317 に答える