diff --git a/scripts/podman/openclaw.container.in b/scripts/podman/openclaw.container.in index 2c9af017c27..db643ca42bc 100644 --- a/scripts/podman/openclaw.container.in +++ b/scripts/podman/openclaw.container.in @@ -9,6 +9,8 @@ Description=OpenClaw gateway (rootless Podman) Image=openclaw:local ContainerName=openclaw UserNS=keep-id +# Keep container UID/GID aligned with the invoking user so mounted config is readable. +User=%U:%G Volume={{OPENCLAW_HOME}}/.openclaw:/home/node/.openclaw EnvironmentFile={{OPENCLAW_HOME}}/.openclaw/.env Environment=HOME=/home/node diff --git a/setup-podman.sh b/setup-podman.sh index 88c7187ba59..0079b3eeb3b 100755 --- a/setup-podman.sh +++ b/setup-podman.sh @@ -56,6 +56,11 @@ run_as_openclaw() { run_as_user "$OPENCLAW_USER" env HOME="$OPENCLAW_HOME" "$@" } +escape_sed_replacement_pipe_delim() { + # Escape replacement metacharacters for sed "s|...|...|g" replacement text. + printf '%s' "$1" | sed -e 's/[\\&|]/\\&/g' +} + # Quadlet: opt-in via --quadlet or OPENCLAW_PODMAN_QUADLET=1 INSTALL_QUADLET=false for arg in "$@"; do @@ -224,7 +229,7 @@ QUADLET_DIR="$OPENCLAW_HOME/.config/containers/systemd" if [[ "$INSTALL_QUADLET" == true && -f "$QUADLET_TEMPLATE" ]]; then echo "Installing systemd quadlet for $OPENCLAW_USER..." run_as_openclaw mkdir -p "$QUADLET_DIR" - OPENCLAW_HOME_SED="$(printf '%s' "$OPENCLAW_HOME" | sed -e 's/[\\/&|]/\\\\&/g')" + OPENCLAW_HOME_SED="$(escape_sed_replacement_pipe_delim "$OPENCLAW_HOME")" sed "s|{{OPENCLAW_HOME}}|$OPENCLAW_HOME_SED|g" "$QUADLET_TEMPLATE" | run_as_openclaw tee "$QUADLET_DIR/openclaw.container" >/dev/null run_as_openclaw chmod 700 "$OPENCLAW_HOME/.config" "$OPENCLAW_HOME/.config/containers" "$QUADLET_DIR" 2>/dev/null || true run_as_openclaw chmod 600 "$QUADLET_DIR/openclaw.container" 2>/dev/null || true