{ "module": "docker", "version": "1", "capabilities": [ "package-manager", "service-manager", "privileged" ], "invokes": [ "seat:mesh-controller.images" ], "claims": [ { "name": "node-container-runtime", "scope": "node" } ], "tools": [ "docker_list", "docker_inspect", "docker_resolv_conf", "docker_logs", "docker_secrets_in_logs", "docker_secrets_in_events", "docker_stats", "docker_start", "docker_stop", "docker_restart", "docker_top", "docker_images", "docker_prune", "docker_prune_images", "docker_disk_usage", "docker_networks", "docker_volumes", "docker_events", "docker_daemon_config", "docker_unlabelled", "docker_problems", "docker_ports" ], "replaces": { "docker_resolv_conf": [ "docker exec cat /etc/resolv.conf" ] }, "settings": { "log-max-size": { "kind": "preference", "default": "100m", "why": "each container's log is cut at this size and the runtime keeps log-max-file of them, so 100m and 10 hold about 1 GB per container: what the one machine with rotation set by hand has (novox/hq issue 452). A whole number from 1 with k, m or g after it, refused before daemon.json is written. The runtime reads it only at its next start, which the mesh never forces, and a container created before that keeps the options it was created with until it is created again" }, "log-max-file": { "kind": "preference", "default": 10, "why": "how many of a container's log files of log-max-size the runtime keeps, the oldest dropped first; a count from 1 to 99, refused before daemon.json is written, taken at the runtime's next start and by containers created after it, like log-max-size (novox/hq issue 452)" } }, "resources": [ { "id": "package", "type": "package", "package": "docker" }, { "id": "buildx", "type": "package", "package": "docker-buildx" }, { "id": "socket", "type": "service", "unit": "docker.socket", "state": "running", "boot": "enabled" }, { "id": "state", "type": "directory", "mode": "0700", "place": "." }, { "id": "log-rotation", "type": "file", "path": "${dir:state}/log-rotation.conf", "mode": "0600", "trusted": true, "content": "# The log rotation daemon.json takes, written by the mesh from this machine's settings log-max-size and\n# log-max-file, and judged by the step log-rotation-check before daemon.json is written (novox/hq issue 452).\n# Replaced on every push; change the settings, never this file.\nsize=${setting:log-max-size}\nfiles=${setting:log-max-file}\n" }, { "id": "log-rotation-check", "type": "process", "name": "docker-log-rotation-check", "artifact": "tools", "run": [ "./docker-tools", "check-log-rotation" ], "run-once": true, "env": { "DOCKER_LOG_ROTATION": "${dir:state}/log-rotation.conf" }, "restart-on": [ "log-rotation" ] }, { "id": "daemon", "type": "file", "path": "/etc/docker/daemon.json", "mode": "0644", "into": "json", "trusted": true, "content": "{\"live-restore\": true, \"insecure-registries\": [\"${seat:mesh-artifact-store:reach}\"], \"log-driver\": \"json-file\", \"log-opts\": {\"max-size\": \"${setting:log-max-size}\", \"max-file\": \"${setting:log-max-file}\"}}\n" }, { "id": "runtime", "type": "service", "unit": "docker.service", "state": "running", "boot": "enabled", "reload-on": [ "daemon" ] }, { "id": "prune-service", "type": "file", "path": "/etc/systemd/system/docker-prune.service", "mode": "0644", "content": "# Generated by the mesh. Do not edit — module docker writes this file and replaces it at every push.\n[Unit]\nDescription=Prune dangling images and unused build cache (the mesh's docker module)\n# Never volumes, never a container, never an image a container uses: dangling\n# images and build cache nothing refers to, unused for a week. What a person\n# prunes beyond that is docker_prune's, by hand.\nAfter=docker.service\nConditionPathExists=/run/docker.sock\n\n[Service]\nType=oneshot\nNice=19\nIOSchedulingClass=idle\nExecStart=/usr/bin/docker image prune --force --filter until=168h\nExecStart=/usr/bin/docker builder prune --force --filter until=168h\n" }, { "id": "prune-timer", "type": "file", "path": "/etc/systemd/system/docker-prune.timer", "mode": "0644", "content": "# Generated by the mesh. Do not edit — module docker writes this file and replaces it at every push.\n[Unit]\nDescription=Weekly prune of dangling images and unused build cache (the mesh's docker module)\n\n[Timer]\nOnCalendar=weekly\nRandomizedDelaySec=1h\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n" }, { "id": "prune", "type": "service", "unit": "docker-prune.timer", "state": "running", "boot": "enabled", "restart-on": [ "prune-service", "prune-timer" ] } ], "build": { "artifacts": [ { "name": "tools", "kind": "bundle", "language": "go", "system": "arch", "from": "cmd/docker-tools", "binary": "docker-tools", "loads": [ "docker-tools" ] } ] } }