1. ホーム
  2. docker

Dockerfileです。RUN 命令を変数に出力する

2023-09-07 23:53:10

質問

dockerfileを書いていて、以下のように"ls"コマンドの出力を変数に入れたいと考えています。

$file = ls /tmp/dir

ここで、"dir"には、1つのファイルしか入っていません。

dockerfile内の以下のRUN命令がうまくいきません。

RUN $file = ls /tmp/dir

どのように解決するのですか?

変数を保存しておいて、後で他の変数で使用することはできません。 Dockerfile コマンドで使用するために変数を保存することはできません (それがあなたの意図であれば)。これは、それぞれの RUN は新しいシェルで起こるからです。

しかし、単に ls の出力をキャプチャするだけなら、一つの RUN の複合コマンドでできるはずです。例えば

RUN file="$(ls -1 /tmp/dir)" && echo $file

サブシェルだけをインラインで使うことも

RUN echo $(ls -1 /tmp/dir)

これがあなたの理解の助けになることを願っています。もしあなたが実際にエラーや問題を解決したいのであれば、仮定的な答えではなく、これを拡大解釈することができます。

完全な例 Dockerfile を示すと、次のようになります。

FROM alpine:3.7
RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
RUN file="$(ls -1 /tmp/dir)" && echo $file
RUN echo $(ls -1 /tmp/dir)

ビルドすると、ステップ 3 と 4 で変数 (この変数には file1file2 をステップ2)で作成します。

$ docker build --no-cache -t test .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM alpine:3.7
 ---> 3fd9065eaf02
Step 2/4 : RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
 ---> Running in abb2fe683e82
Removing intermediate container abb2fe683e82
 ---> 2f6dfca9385c
Step 3/4 : RUN file="$(ls -1 /tmp/dir)" && echo $file
 ---> Running in 060a285e3d8a
file1 file2
Removing intermediate container 060a285e3d8a
 ---> 2e4cc2873b8c
Step 4/4 : RUN echo $(ls -1 /tmp/dir)
 ---> Running in 528fc5d6c721
file1 file2
Removing intermediate container 528fc5d6c721
 ---> 1be7c54e1f29
Successfully built 1be7c54e1f29
Successfully tagged test:latest