У самурая нет тестов, только прод

Здрасти. Есть куча способов, как определить, в каком окружении запущен Bash-скрипт: на хостовой машине или внутри Docker-контейнера. Я предпочитаю самый простой.

if [ -f /.dockerenv ]; then
    echo "I'm inside docker";
else
    echo "I'm living in real world!";
fi
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Банально проверяем наличие файла /.dockerenv — и всё! Да, так просто. Способ самый универсальный и используется разработчиками в 99% случаев.

И да, файл /.dockerenv можно удалить, и тогда скрипт сломается. Удобно, если хочешь помешать скриптам определять, где они выполняются. Но после перезапуска контейнера файл /.dockerenv снова появится.

А если требуется высший пилотаж, прям УНИВЕРСАЛЬНО прочекать Docker и LXC, идём таким путём:

if [ -n "$(grep 'kthreadd' /proc/2/status 2>/dev/null)" ]; then
    echo "I'm living in real world!"
else
    echo "I'm inside container";
fi

Тут суть такая: во всех хост-системах PID(2) == kthreadd.

Запускаем на хостовой машине:

ps -p 2

PID TTY TIME CMD
2 ? 00:00:00 kthreadd

Запускаем в контейнере:

ps -p 2
PID TTY TIME CMD
хуй с маслом

Да, кто не знал: как сохранять изменения в Docker-контейнерах — применяется commit. То есть ставишь софт в контейнере, настраиваешь его там под себя. А потом делаешь:

docker commit <ID> <name>

<ID> — ID того контейнера, в котором всё ставил.
<name> — да похуй, можешь указать тот же самый.

После перезапуска контейнера все твои настройки сохранятся. Но лучше этим не частить, а собирать контейнеры сразу с нужной тебе хуйнёй.

Ладно, погнали дальше спасать этот прекрасный мир.