Вы можете абстрагировать все эти логи c в ваше приложение более высокого уровня. Если вы не можете этого сделать, напишите стандартный сценарий оболочки и COPY
в свой образ.
Тройные кавычки выглядят как синтаксис Python. Вы можете разбить это на три части:
- Часть
cd $dir
определяет рабочий каталог для подпроцесса; make ...
- фактическая команда для запуска; - Вы проверяете его вывод на наличие каких-либо условий.
В Python вы можете вызвать subprocess.run()
с массивом аргументов и указать эти различные вещи в уровень приложения. Массив аргументов не интерпретируется оболочкой и защищает вас от этой конкретной проблемы безопасности. Вы можете запустить:
completed = subprocess.run(['make', 'image', dockerImageName],
cwd=dir,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
if 'No rule to make target' in completed.stdout:
...
Если вам нужно сделать это как скрипт оболочки, сделайте это как правильный скрипт оболочки и убедитесь, что вы снова цитируете свои аргументы, защищает вас.
#!/bin/sh
set -e
cd "$1"
if make image "$2" 2>&1 | grep -m 1 "No rule to make target"; then
exit 1
fi
Вы никогда не должны создавать командную строку, комбинируя строки так, как вы показали. Это делает вас уязвимым для атаки с помощью инъекции оболочки . Особенно, если злоумышленник знает, что у пользователя есть права на запуск команд docker
, он может установить
dir = '.; docker run --rm -v /:/host busybox cat /host/etc/shadow'
и получить файл с зашифрованными паролями, которые они могут взломать на досуге. Практически все остальное возможно, если злоумышленник использует эту технику, чтобы получить неограниченный root -уровневый доступ для чтения / записи к файловой системе хоста.