
Part of the motivation for 800eb863 (Hooks supports two directories, process default and override, 2018-09-17, #1487) was [1]: > We only use this for override. The reason this was caught is people > are trying to get hooks to work with CoreOS. You are not allowed to > write to /usr/share... on CoreOS, so they wanted podman to also look > at /etc, where users and third parties can write. But we'd also been disabling hooks completely for rootless users. And even for root users, the override logic was tricky when folks actually had content in both directories. For example, if you wanted to disable a hook from the default directory, you'd have to add a no-op hook to the override directory. Also, the previous implementation failed to handle the case where there hooks defined in the override directory but the default directory did not exist: $ podman version Version: 0.11.2-dev Go Version: go1.10.3 Git Commit: "6df7409cb5a41c710164c42ed35e33b28f3f7214" Built: Sun Dec 2 21:30:06 2018 OS/Arch: linux/amd64 $ ls -l /etc/containers/oci/hooks.d/test.json -rw-r--r--. 1 root root 184 Dec 2 16:27 /etc/containers/oci/hooks.d/test.json $ podman --log-level=debug run --rm docker.io/library/alpine echo 'successful container' 2>&1 | grep -i hook time="2018-12-02T21:31:19-08:00" level=debug msg="reading hooks from /usr/share/containers/oci/hooks.d" time="2018-12-02T21:31:19-08:00" level=warning msg="failed to load hooks: {}%!(EXTRA *os.PathError=open /usr/share/containers/oci/hooks.d: no such file or directory)" With this commit: $ podman --log-level=debug run --rm docker.io/library/alpine echo 'successful container' 2>&1 | grep -i hook time="2018-12-02T21:33:07-08:00" level=debug msg="reading hooks from /usr/share/containers/oci/hooks.d" time="2018-12-02T21:33:07-08:00" level=debug msg="reading hooks from /etc/containers/oci/hooks.d" time="2018-12-02T21:33:07-08:00" level=debug msg="added hook /etc/containers/oci/hooks.d/test.json" time="2018-12-02T21:33:07-08:00" level=debug msg="hook test.json matched; adding to stages [prestart]" time="2018-12-02T21:33:07-08:00" level=warning msg="implicit hook directories are deprecated; set --hooks-dir="/etc/containers/oci/hooks.d" explicitly to continue to load hooks from this directory" time="2018-12-02T21:33:07-08:00" level=error msg="container create failed: container_linux.go:336: starting container process caused "process_linux.go:399: container init caused \"process_linux.go:382: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: oh, noes!\\\\n\\\"\"" (I'd setup the hook to error out). You can see that it's silenly ignoring the ENOENT for /usr/share/containers/oci/hooks.d and continuing on to load hooks from /etc/containers/oci/hooks.d. When it loads the hook, it also logs a warning-level message suggesting that callers explicitly configure their hook directories. That will help consumers migrate, so we can drop the implicit hook directories in some future release. When folks *do* explicitly configure hook directories (via the newly-public --hooks-dir and hooks_dir options), we error out if they're missing: $ podman --hooks-dir /does/not/exist run --rm docker.io/library/alpine echo 'successful container' error setting up OCI Hooks: open /does/not/exist: no such file or directory I've dropped the trailing "path" from the old, hidden --hooks-dir-path and hooks_dir_path because I think "dir(ectory)" is already enough context for "we expect a path argument". I consider this name change non-breaking because the old forms were undocumented. Coming back to rootless users, I've enabled hooks now. I expect they were previously disabled because users had no way to avoid /usr/share/containers/oci/hooks.d which might contain hooks that required root permissions. But now rootless users will have to explicitly configure hook directories, and since their default config is from ~/.config/containers/libpod.conf, it's a misconfiguration if it contains hooks_dir entries which point at directories with hooks that require root access. We error out so they can fix their libpod.conf. [1]: https://github.com/containers/libpod/pull/1487#discussion_r218149355 Signed-off-by: W. Trevor King <wking@tremily.us>
3.1 KiB
% libpod.conf(5)
NAME
libpod.conf - libpod configuration file
DESCRIPTION
The libpod.conf file is the default configuration file for all tools using libpod to manage containers.
OPTIONS
image_default_transport="" Default transport method for pulling and pushing images
runtime_path="" Paths to search for a valid OCI runtime binary
conmon_path="" Paths to search for the Conmon container manager binary
conmon_env_vars="" Environment variables to pass into Conmon
cgroup_manager="" Specify the CGroup Manager to use; valid values are "systemd" and "cgroupfs"
hooks_dir=["path", ...]
Each *.json
file in the path configures a hook for Podman containers. For more details on the syntax of the JSON files and the semantics of hook injection, see oci-hooks(5)
. Podman and libpod currently support both the 1.0.0 and 0.1.0 hook schemas, although the 0.1.0 schema is deprecated.
Paths listed later in the array higher precedence (oci-hooks(5)
discusses directory precedence).
For the annotation conditions, libpod uses any annotations set in the generated OCI configuration.
For the bind-mount conditions, only mounts explicitly requested by the caller via --volume
are considered. Bind mounts that libpod inserts by default (e.g. /dev/shm
) are not considered.
If hooks_dir
is unset for root callers, Podman and libpod will currently default to /usr/share/containers/oci/hooks.d
and /etc/containers/oci/hooks.d
in order of increasing precedence. Using these defaults is deprecated, and callers should migrate to explicitly setting hooks_dir
.
static_dir="" Directory for persistent libpod files (database, etc) By default this will be configured relative to where containers/storage stores containers
tmp_dir="" Directory for temporary files Must be a tmpfs (wiped after reboot)
max_log_size="" Maximum size of log files (in bytes)
no_pivot_root="" Whether to use chroot instead of pivot_root in the runtime
cni_config_dir="" Directory containing CNI plugin configuration files
cni_plugin_dir="" Directories where CNI plugin binaries may be located
pause_image = ""
Pause container image name for pod pause containers. When running a pod, we
start a pause
processes in a container to hold open the namespaces associated with the
pod. This container and process, basically sleep/pause for the lifetime of the pod.
pause_command="" Command to run the pause container
namespace="" Default libpod namespace. If libpod is joined to a namespace, it will see only containers and pods that were created in the same namespace, and will create new containers and pods in that namespace. The default namespace is "", which corresponds to no namespace. When no namespace is set, all containers and pods are visible.
label="true|false" Indicates whether the containers should use label separation.
FILES
/usr/share/containers/libpod.conf
, default libpod configuration path
/etc/containers/libpod.conf
, override libpod configuration path
HISTORY
Apr 2018, Originally compiled by Nathan Williams nath.e.will@gmail.com