Я пишу dockerfile и хочу поместить вывод команды "ls" в переменную, как показано ниже:
$file = ls /tmp/dir
Здесь "dir" содержит только один файл.
Следующая инструкция RUN в докер файле не работает
RUN $file = ls /tmp/dir
Я пишу dockerfile и хочу поместить вывод команды "ls" в переменную, как показано ниже:
$file = ls /tmp/dir
Здесь "dir" содержит только один файл.
Следующая инструкция RUN в докер файле не работает
RUN $file = ls /tmp/dir
Вы не можете сохранить переменную для последующего использования в других командах 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
Я не мог заставить Энди (или любой другой) подход работать в самом Dockerfile, поэтому я установил в качестве точки входа Dockerfile файл bash, содержащий:
#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)
Обратите внимание, что второй метод не отображает разрывы строк, поэтому я нашел первый метод - echo через переменную $file
- улучшенный.
Я использовал это специально для печати цветов на консоли. Если ваш контейнер имеет 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 ")'