Skip to content

Commit

Permalink
Use containers procfs to parse mountinfo
Browse files Browse the repository at this point in the history
Usually the mount is the first line making parsing way
faster than going through entire system mounts list.

Signed-off-by: Mrunal Patel <[email protected]>
  • Loading branch information
mrunalp committed Jan 26, 2019
1 parent 239d1d3 commit 1beeb42
Showing 1 changed file with 58 additions and 47 deletions.
105 changes: 58 additions & 47 deletions container_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,65 @@
import subprocess
import sys


def get_container_layers(id):
try:
container_status = subprocess.check_output(["runc", "state", container_id])
except subprocess.CalledProcessError:
print "container not found; probably exited"
sys.exit(0)

status_json = json.loads(container_status)
if status_json['status'] == "stopped":
print "container already stopped"
sys.exit(0)

rootfs_path = status_json['rootfs']
dir_path = os.path.dirname(rootfs_path)
top_layer_id = os.path.basename(dir_path)
container_mount_output = subprocess.check_output("mount | grep " + top_layer_id, shell=True)

if container_mount_output == "":
print "container not found; probably exited"
sys.exit(0)

layers = []
m = re.search('lowerdir=(.*),upperdir', container_mount_output)
if m:
lowerdirs = m.group(1).split(':')
for l in lowerdirs:
layers.append(l)
else:
print "Unable to find lowerdir in mount output: ", container_mount_output
sys.exit(1)

m = re.search('upperdir=(.*),workdir', container_mount_output)
if m:
upperdir = m.group(1)
layers.append(upperdir)
else:
print "Unable to find upperdir in mount output: ", container_mount_output
sys.exit(1)

return layers
try:
container_status = subprocess.check_output(
["runc", "state", container_id])
except subprocess.CalledProcessError:
print "container not found; probably exited"
sys.exit(0)

status_json = json.loads(container_status)
if status_json['status'] == "stopped":
print "container already stopped"
sys.exit(0)

rootfs_path = status_json['rootfs']
dir_path = os.path.dirname(rootfs_path)
top_layer_id = os.path.basename(dir_path)
container_pid = status_json['pid']

# Note: os.path.join failed for some reason on RHCOS
countainer_mounts_path = "/proc/" + str(container_pid) + "/mountinfo"
container_mount_output = ""
with open(countainer_mounts_path, "r") as f:
for line in f:
if re.search(top_layer_id, line):
container_mount_output = line
break

if container_mount_output == "":
print "container mount not found; probably exited"
sys.exit(0)

layers = []
m = re.search('lowerdir=(.*),upperdir', container_mount_output)
if m:
lowerdirs = m.group(1).split(':')
for l in lowerdirs:
layers.append(l)
else:
print "Unable to find lowerdir in mount output: ", container_mount_output
sys.exit(1)

m = re.search('upperdir=(.*),workdir', container_mount_output)
if m:
upperdir = m.group(1)
layers.append(upperdir)
else:
print "Unable to find upperdir in mount output: ", container_mount_output
sys.exit(1)

return layers


if __name__ == "__main__":
if len(sys.argv) < 2:
print "Usage: sys.argv[0] <container_id>"
sys.exit(1)

container_id = sys.argv[1]
layers = get_container_layers(container_id)
for l in layers:
print l
if len(sys.argv) < 2:
print "Usage: sys.argv[0] <container_id>"
sys.exit(1)

container_id = sys.argv[1]
layers = get_container_layers(container_id)
for l in layers:
print l

0 comments on commit 1beeb42

Please sign in to comment.