Agnosti c bash проверка, обнаруживает, работает внутри контейнеров или нет - PullRequest
0 голосов
/ 01 февраля 2020

Я ищу простой, но надежный способ определения из оболочки (bash), работает ли он внутри контейнера или нет, независимо от того, работает ли этот контейнер с docker, lx c, pods, ...

Мне нужно это для того, чтобы собрать, чтобы собрать вывод systemctl status "*". Главным образом я хочу избежать шумного сбоя, такого как Failed to get D-Bus connection: Operation not permitted, который почти наверняка произойдет внутри контейнеров.

Желаемый результат - возвращать успех и не выводить данные внутри контейнеров и запускать systemctl в других случаях.

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

Ответы [ 3 ]

1 голос
/ 01 февраля 2020

Я использую if [ -f /.dockerenv ]; then echo "inside container"; else echo "not in container"; fi для docker времени выполнения.

1 голос
/ 01 февраля 2020

После комментария @chepner, с которым я на 100% согласен, как насчет следующей KISS реализации?

Посмотрите на man systemctl и возвращаемые имена и значения для is-system-running, если вы хотите будьте более точны и избегайте возможных ошибок.

# Check if systemctl command is available at all
if which systemctl 2>&1 > /dev/null; then
    # Check that systemctl isn't offline
    if [ ! "$(systemctl is-system-running)" == "offline" ]; then
      systemctl status '*'
    fi
fi

Проверено на:

  • мой локальный компьютер с Ubuntu: отображается состояние
  • a docker контейнер с systemd полностью запущен: статус отображается
  • a docker контейнер с systemd установлен, но не запущен: пустой вывод
  • a docker контейнер без systemd установлен: пустой вывод
0 голосов
/ 02 февраля 2020

В сообщении "systemctl status" просто говорится, что демон systemd не запущен. Некоторые скрипты пришли, чтобы проверить это - cat / proc / 1 / cmdline | grep systemd - на реальной машине. В противном случае - нет.

Однако, новые подходы, такие как Redhat "podman --systemd = true", победят это, и команды systemctl снова будут работать. То же самое для моего docker -systemctl-replace сценария, который работает везде.

Так что я думаю, у вас здесь не тот вопрос. Контейнер может подойти для команд "systemctl".

...