Dockerfile: вывод инструкции RUN в переменную

Я пишу dockerfile и хочу поместить вывод команды "ls" в переменную, как показано ниже:

$file = ls /tmp/dir

Здесь "dir" содержит только один файл.

Следующая инструкция RUN в докер файле не работает

RUN $file = ls /tmp/dir

Ответ 1

Вы не можете сохранить переменную для последующего использования в других командах Dockerfile (если это ваше намерение). Это потому, что каждый RUN происходит в новой оболочке.

Однако, если вы просто хотите захватить вывод команды ls вы можете сделать это с помощью одной составной команды RUN. Например:

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

Или просто используя subshell inline:

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

Ответ 2

Я не мог заставить Энди (или любой другой) подход работать в самом Dockerfile, поэтому я установил в качестве точки входа Dockerfile файл bash, содержащий:

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

Обратите внимание, что второй метод не отображает разрывы строк, поэтому я нашел первый метод - echo через переменную $file - улучшенный.

Ответ 3

Я использовал это специально для печати цветов на консоли. Если ваш контейнер имеет 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