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
誰もが正しい方法を知っています
その変数で文字列補間を使用して、次のように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 build
docker run
ARG
- ビルド時にのみ使用できる環境変数ですhttps://docs.docker.com/engine/reference/builder/#environment-replacementを見ると、これらの環境変数を直接サポートするdockerfile命令のリストが表示されます。これが、COPY
あなたが言ったように「変数を拾う」理由です。
RUN
もございませんのでご了承くださいENTRYPOINT
。それはどのように機能しますか?
ドキュメントを掘り下げる必要があります。まずRUN
(https://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"]
コンテナの開始時に使用できるのはランタイム変数のみであることENTRYPOINT
をCMD
除いて、同じことが当てはまります。
# 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]
コメントを追加