Dockerfileを作成していて、「ls」コマンドの出力を次のように変数に入れたいと思います。
$file = ls /tmp/dir
ここで、「dir」にはその中に1つのファイルしかありません。
Dockerfile内の次のRUN命令が機能していません
RUN $file = ls /tmp/dir
他のDockerfile
コマンドで後で使用するために変数を保存することはできません(それが意図の場合)。これは、各RUN
が新しいシェルで発生するためです。
ただし、ls
の出力のみをキャプチャする場合は、1つの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が変数(file1
およびfile2
ステップ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
Andy(または他の)のアプローチをDockerfile自体で動作させることができなかったので、Dockerfileエントリポイントを以下を含むbashファイルに設定しました。
#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)
2番目のメソッドは改行をレンダリングしないので、最初のメソッドが見つかりました-$file
変数-上位。