web-dev-qa-db-ja.com

Dockerfile:RUN命令の変数への出力

Dockerfileを作成していて、「ls」コマンドの出力を次のように変数に入れたいと思います。

$file = ls /tmp/dir

ここで、「dir」にはその中に1つのファイルしかありません。

Dockerfile内の次のRUN命令が機能していません

RUN $file = ls /tmp/dir
21
meallhour

他の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
33
Andy Shinn

Andy(または他の)のアプローチをDockerfile自体で動作させることができなかったので、Dockerfileエントリポイントを以下を含むbashファイルに設定しました。

#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)

2番目のメソッドは改行をレンダリングしないので、最初のメソッドが見つかりました-$file変数-上位。

0
Chris

コンソールに色を印刷するためにこれを使用しました。コンテナにpythonがある場合、次のことができます。

python -c 'print(" \033[31m RED TEXT \033[0m ")'
python -c 'print(" \033[32m GREEN TEXT \033[0m ")'
python -c 'print(" \033[34m BLUE TEXT \033[0m ")'

enter image description here

0