Dockerの文字列で変数補間を使用する

Alexander Mills:

Dockerfileで変数を作成して使用するのに問題があります-次のコマンドを使用して、Dockerfile経由でDockerイメージをビルドします。

$ docker build --build-arg s=scripts/a.sh -t a .

(つまり、私は--build-argを使用しているため、$ sはDockerfileで使用可能な引数となり、この部分は機能します)

Dockerfileは次のようになります。

ARG s

RUN echo $s 

RUN useradd -ms /bin/bash newuser

USER newuser
WORKDIR /home/newuser

ENV fn=$(filename $s)  # fails on this line

COPY $s .

ENTRYPOINT ["/bin/bash", "/home/newuser/$fn"]

私が抱えている問題は、上記の行でDockerビルドが失敗することです。

Error response from daemon: Syntax error - can't find = in "$s)". Must be of the form: name=value

その行をこれに変更すると:

RUN fn=$(filename $s)

私はこのエラーを受け取ります:

Error: Command failed: docker build --build-arg s=scripts/a.sh -t a .
The command '/bin/sh -c fn=$(filename $s)' returned a non-zero code: 127

誰もが正しい方法を知っています

  1. Dockerファイル内に変数を作成する
  2. その変数で文字列補間を使用して、次のようにENTRYPOINT引数で変数を参照できるようにします。

    ENTRYPOINT ["/ bin / bash"、 "/ home / newuser / $ var"]

私がこれをしても:

ARG s

ARG sname

RUN echo $s          # works as expected
RUN echo $sname      # works as expected

RUN useradd -ms /bin/bash newuser

USER newuser
WORKDIR /home/newuser


COPY $s .  # works as expected (I believe)

ENTRYPOINT /bin/bash /home/newuser/$sname  # does not work as expected

「非JSON」バージョンのENTRYPOINTを使用していますが、それでも$sname変数の値を取得できないようです。

ヴィルレム:

変数ENTRYPOINTをまったく使用しないようにしますこれはトリッキーであり、何が起こっているのかを深く理解する必要があります。そして偶然にそれを壊すのは簡単です。次のいずれかを検討してください。

起動スクリプトへの既知の名前のリンクを作成します。

RUN ln -s /home/newuser/$sname /home/newuser/docker_entrypoint.sh
ENTRYPOINT ["/home/newuser/docker_entrypoint.sh"]

または、必要なものを実行するスタンドアロンのエントリポイントスクリプトを記述します。

しかし、質問のソリューションがどのように、そしてなぜ機能するのか知りたい場合は、読み続けてください。

最初にいくつかの定義。

  • ENV- ビルドタイム()およびランタイム(中に使用可能な環境変数docker builddocker run
  • ARG- ビルド時にのみ使用できる環境変数です

https://docs.docker.com/engine/reference/builder/#environment-replacementを見ると、これらの環境変数を直接サポートするdockerfile命令のリストが表示されますこれが、COPYあなたが言ったように「変数を拾う」理由です。

RUNございませんのでご了承くださいENTRYPOINTそれはどのように機能しますか?

ドキュメントを掘り下げる必要があります。まずRUNhttps://docs.docker.com/engine/reference/builder/#run)。2つの形式があります。最初のものはシェルを介してコマンドを実行し、このシェルはビルドタイム環境変数にアクセスできます。

# this works because it is called as /bin/sh -c 'echo $sname'
# the /bin/sh replace $sname for you      
RUN echo $sname 

# this does NOT work. There is no shell process to do $sname replacement 
# for you
RUN ["echo", "$sname"]

コンテナの開始時に使用できるのはランタイム変数のみであることENTRYPOINTCMD除いて、同じことが当てはまります。

# first you need to make some runtime variable from builtime one
ENV sname $sname

# Then you can use it during container runtime
# docker runs `/bin/sh -c '/bin/bash /home/newuser/$sname'` for you
# and this `/bin/sh` proces interprets `$sname`
ENTRYPOINT /bin/bash /home/newuser/$sname

# but this does NOT work. There is no process to interpolate `$sname`
# docker runs what you describe.
ENTRYPOINT ["/bin/bash", "/home/newuser/$sname"]

2017-04-03を編集:他の回答やコメントから感じる混乱を避けるために、Dockerのドキュメントへのリンクを更新し、わずかな言い換えを変更しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

変数を文字列に補間する

分類Dev

bashのような環境変数の参照で文字列を補間する

分類Dev

連結せずにJavaScriptで文字列の変数を補間する方法は?

分類Dev

変数ソースとしてHashMapを使用して文字列内の変数を補間する方法

分類Dev

変数の文字列補間

分類Dev

変数の文字列補間

分類Dev

Angular Translate:HTMLの補間文字列で.replaceを使用する

分類Dev

文字列補間用の未使用の変数に関するPyLint警告

分類Dev

環境変数を表す文字列を補間する方法

分類Dev

Scala-実装されていない変数を含むTrait内で文字列補間を使用する

分類Dev

javascriptまたはtypescript文字列の変数値を補間するにはどうすればよいですか?

分類Dev

変数の指定された名前を文字列に補間する方法は?

分類Dev

「aws_sns_topic_subscription」の「エンドポイント」の補間文字列で変数を使用するにはどうすればよいですか?

分類Dev

VS 2013で文字列補間を使用する関数を書き直す方法は?

分類Dev

ダーツ:変数に文字列補間を強制する方法

分類Dev

オブジェクトの変更中にRuby文字列補間を使用する

分類Dev

Reactの文字列変数で文字列補間を行うにはどうすればよいですか?

分類Dev

正しいインデントで複数行の文字列を補間する

分類Dev

関数呼び出しに文字列補間を使用する

分類Dev

bashで、文字列内に動的変数を持つ変数の補間を遅らせる方法

分類Dev

文字列内の数値を補間する方法

分類Dev

文字列補間内の変数を使用して小数点以下の桁数を指定します

分類Dev

補間を使用して変数を使用してGroovyマップに文字列を追加する

分類Dev

C#で文字列補間を使用して複数の文字列を連結します

分類Dev

string.replaceで文字列補間を使用する方法

分類Dev

CultureInfoで文字列補間を使用する方法は?

分類Dev

文字列補間のマップで「_」を使用します

分類Dev

小数を2の補数文字列に変換する方法

分類Dev

角度の文字列補間でrouterlinkを追加する方法

Related 関連記事

  1. 1

    変数を文字列に補間する

  2. 2

    bashのような環境変数の参照で文字列を補間する

  3. 3

    連結せずにJavaScriptで文字列の変数を補間する方法は?

  4. 4

    変数ソースとしてHashMapを使用して文字列内の変数を補間する方法

  5. 5

    変数の文字列補間

  6. 6

    変数の文字列補間

  7. 7

    Angular Translate:HTMLの補間文字列で.replaceを使用する

  8. 8

    文字列補間用の未使用の変数に関するPyLint警告

  9. 9

    環境変数を表す文字列を補間する方法

  10. 10

    Scala-実装されていない変数を含むTrait内で文字列補間を使用する

  11. 11

    javascriptまたはtypescript文字列の変数値を補間するにはどうすればよいですか?

  12. 12

    変数の指定された名前を文字列に補間する方法は?

  13. 13

    「aws_sns_topic_subscription」の「エンドポイント」の補間文字列で変数を使用するにはどうすればよいですか?

  14. 14

    VS 2013で文字列補間を使用する関数を書き直す方法は?

  15. 15

    ダーツ:変数に文字列補間を強制する方法

  16. 16

    オブジェクトの変更中にRuby文字列補間を使用する

  17. 17

    Reactの文字列変数で文字列補間を行うにはどうすればよいですか?

  18. 18

    正しいインデントで複数行の文字列を補間する

  19. 19

    関数呼び出しに文字列補間を使用する

  20. 20

    bashで、文字列内に動的変数を持つ変数の補間を遅らせる方法

  21. 21

    文字列内の数値を補間する方法

  22. 22

    文字列補間内の変数を使用して小数点以下の桁数を指定します

  23. 23

    補間を使用して変数を使用してGroovyマップに文字列を追加する

  24. 24

    C#で文字列補間を使用して複数の文字列を連結します

  25. 25

    string.replaceで文字列補間を使用する方法

  26. 26

    CultureInfoで文字列補間を使用する方法は?

  27. 27

    文字列補間のマップで「_」を使用します

  28. 28

    小数を2の補数文字列に変換する方法

  29. 29

    角度の文字列補間でrouterlinkを追加する方法

ホットタグ

アーカイブ