Независимая проверка bash, которая определяет, работает ли он внутри контейнеров или нет

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

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

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

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


person sorin    schedule 01.02.2020    source источник
comment
Вы можете проверить это: stackoverflow.com/questions/20010199/   -  person Philippe    schedule 01.02.2020
comment
Вы фокусируетесь не на той проблеме. Вам все равно, если вы находитесь в контейнере; вас волнует, имеет ли смысл запускать systemctl status "*".   -  person chepner    schedule 01.02.2020


Ответы (3)


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

person Egor Stambakio    schedule 01.02.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: отображается статус
  • док-контейнер с полностью запущенным systemd: отображается статус
  • док-контейнер с установленным, но не запущенным systemd: пустой вывод
  • док-контейнер без установленного systemd: пустой вывод
person Zeitounator    schedule 01.02.2020
comment
@tripleee исправлено. Моим первоначальным намерением было проверить несколько статусов возврата, но в этом случае в этом не было необходимости (и я должен был зафиксировать возврат в одной строке в соответствии с передовой практикой;)) - person Zeitounator; 01.02.2020

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

Однако более новые подходы, такие как Redhat «podman --systemd=true», преодолеют это, и команды systemctl снова работают. То же самое и с моим скриптом docker-systemctl-replacement, который работает везде.

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

person Guido U. Draheim    schedule 02.02.2020