GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu nahradit lsof uvnitř Dockeru (nativního, nikoli založeného na LXC)

(POZNÁMKA:v otázce není jasné, jak tazatel vstupuje do kontejneru dockeru. Předpokládám docker exec -it CONTAINER bash byl použit.)

Měl jsem tento problém při použití obrázku dockeru založeného na centos:7 s verzí dockeru 1.9.0 a abych to překonal, běžel jsem:

docker exec --privileged -it CONTAINER bash

Všimněte si zahrnutí --privileged .

Moje naivní chápání důvodu, proč je to vyžadováno:zdá se, že docker se snaží, aby byl kontejner "bezpečnější", jak je zdokumentováno zde.


Hah, děj houstne. Pokud má někdo lepší odpověď, napište ji a já ji přijmu, pokud to bude přijatelné. Ale tady je zjevný důvod. Je ode mě nedbalé ignorovat soubory protokolu na hostiteli :

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

Zdá se tedy, že viníkem je apparmor, i když budu muset přijít na to, jak ho přesvědčit, aby to povolil bez ohrožení zabezpečení hostitele/kontejneru, nebo abych zjistil, zda je to vůbec možné bez ohrožení bezpečnosti.


Další možnost, tentokrát s jemnějším nastavením zabezpečení:udělte kontejneru dockeru oprávnění SYS_PTRACE:

docker run --cap-add=SYS_PTRACE ...

Linux
  1. Najít soubory, které uživatel nemůže číst?

  2. Jak mohu číst dokumentaci o vestavěných příkazech zsh?

  3. Jak mohu zjistit, který proces má soubor otevřený v Linuxu?

  1. Může být skript spustitelný, ale nečitelný?

  2. Jak spustit program uvnitř kontejneru Docker?

  3. Proč můj crontab nefunguje a jak jej mohu odstranit?

  1. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  2. Může read(2) vrátit nulu, když není na EOF?

  3. Jak mohu zkontrolovat, zda je PostgreSQL nainstalován nebo ne prostřednictvím skriptu Linux?