podman-compose icon indicating copy to clipboard operation
podman-compose copied to clipboard

Does podman-compose have a way to pass the "--userns keep-id" argument?

Open coreyryanhanson opened this issue 4 years ago • 14 comments

If I add a line to a yaml to be read by podman-compose with "userns_mode: keep-id", it ignores it completely. I've tried a few variations like "userns: keep-id" (matching the podman command line argument), but every time the code generated to call the containers does not change. Is this argument not supported yet in podman-compose?

coreyryanhanson avatar May 04 '20 01:05 coreyryanhanson

Only workaround I found is to set it in .bashrc/.zshrc:

export PODMAN_USERNS=keep-id

As per http://docs.podman.io/en/latest/markdown/podman-create.1.html for –userns, "It defaults to the PODMAN_USERNS environment variable."

That said, I then had other perms issues creating the container (container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: rootfs_linux.go:59: mounting "sysfs" to rootfs at "/sys" caused: operation not permitted: OCI runtime permission denied error), but that's off topic.

pm98zz-c avatar Jan 01 '21 08:01 pm98zz-c

I've been facing issues with permissions on volume mounts for Postgres containers. Basically some folder inside my $HOME that Postgres Dockerfile tries to chown inside the container. Passing --userns=keep-id apparently solves the problem but I cannot rely on the environment variable because then other services in the same docker-compose.yml fail when doing rm for instance, thus I need to manage them separatedly.

miquecg avatar Sep 21 '22 15:09 miquecg

you can pass it using userns_mode: keep-id in the YAML

https://github.com/containers/podman-compose/blob/105c27c8dc902a72fcf1cd6784159b43fed6f808/podman_compose.py#L866

here is an example

https://github.com/containers/podman-compose/blob/devel/examples/nodeproj/docker-compose.yml#L17 https://github.com/containers/podman-compose/tree/devel/examples/nodeproj

the example out of the box passes UID from .env not keep-id

you can also put PODMAN_USERNS=keep-id in your .env because all PODMAN_* are passed

muayyad-alsadi avatar Sep 22 '22 10:09 muayyad-alsadi

I've just tried adding that line to a docker-compose.yml but it doesn't work for me, as @coreyryanhanson pointed out. podman-compose generates a podman create command which doesn't include the flag --userns=keep-id, so the only way to change this seems to be through the environment.

PODMAN_USERNS=keep-id podman-compose up database works perfectly.

miquecg avatar Sep 23 '22 14:09 miquecg

The userns_mode config in podman-compose has not yet been released, it was added after the latest 1.0.3 release.

josharrington avatar Dec 01 '22 22:12 josharrington

I have a compose file with two services. When using the devel branch and the userns: keep-id option in the services, I get the following error when running podman-compose up:

Error: --userns and --pod cannot be set together

(click here for full command output)
podman-compose version: 1.0.4
['podman', '--version', '']
using podman version: 4.3.1
** excluding:  set()
['podman', 'ps', '--filter', 'label=io.podman.compose.project=rtorrent-flood', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}']
podman pod create --name=pod_rtorrent-flood --infra=false --share=
Error: adding pod to state: name "pod_rtorrent-flood" is in use: pod already exists
exit code: 125
podman volume inspect rtorrent-flood_rtorrent_scgi || podman volume create rtorrent-flood_rtorrent_scgi
['podman', 'volume', 'inspect', 'rtorrent-flood_rtorrent_scgi']
['podman', 'network', 'exists', 'rtorrent-flood_default']
podman create --name=rtorrent --pod=pod_rtorrent-flood --label io.podman.compose.config-hash=6db604d3f9ebcfb5e266cb0c09efa2ecb0dd0ea3f750f0457b30fc332b83ce8d --label io.podman.compose.project=rtorrent-flood --label io.podman.compose.version=1.0.4 --label [email protected] --label com.docker.compose.project=rtorrent-flood --label com.docker.compose.project.working_dir=/home/ige/rtorrent-flood --label com.docker.compose.project.config_files=compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=rtorrent -v /home/ige/.config/rtorrent.rc:/home/rtorrent/.config/rtorrent/rtorrent.rc:z,ro -v rtorrent-flood_rtorrent_scgi:/home/rtorrent/.local/share/rtorrent/scgi -v /storage/merged/rtorrent_watch:/home/rtorrent/.local/share/rtorrent/watch -v /storage/merged/rtorrent_dl_test:/home/rtorrent/.local/share/rtorrent/download -v /home/ige/.local/state/rtorrent/session:/home/rtorrent/.local/share/rtorrent/.session:z --net rtorrent-flood_default --network-alias rtorrent -p 0.0.0.0:9779:9779/tcp --userns keep-id localhost/rtorrent:v0.9.8-r16
Error: --userns and --pod cannot be set together
exit code: 125
podman volume inspect rtorrent-flood_rtorrent_scgi || podman volume create rtorrent-flood_rtorrent_scgi
['podman', 'volume', 'inspect', 'rtorrent-flood_rtorrent_scgi']
['podman', 'network', 'exists', 'rtorrent-flood_default']
podman create --name=flood --pod=pod_rtorrent-flood --requires=rtorrent --label io.podman.compose.config-hash=6db604d3f9ebcfb5e266cb0c09efa2ecb0dd0ea3f750f0457b30fc332b83ce8d --label io.podman.compose.project=rtorrent-flood --label io.podman.compose.version=1.0.4 --label [email protected] --label com.docker.compose.project=rtorrent-flood --label com.docker.compose.project.working_dir=/home/ige/rtorrent-flood --label com.docker.compose.project.config_files=compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=flood -v /storage/merged/rtorrent_dl_test:/home/rtorrent/.local/share/rtorrent/download -v rtorrent-flood_rtorrent_scgi:/home/rtorrent/.local/share/rtorrent/scgi --net rtorrent-flood_default --network-alias flood -p 127.0.0.1:8830:3000/tcp --userns keep-id -u 1000:1000 localhost/flood:v4.7.0
Error: --userns and --pod cannot be set together
exit code: 125
podman start -a rtorrent
Error: no container with name or ID "rtorrent" found: no such container
exit code: 125
podman start -a flood
Error: no container with name or ID "flood" found: no such container
exit code: 125

Is this a bug? It seems rather weird because PODMAN_USERNS=keep-id podman-compose up works as expected for the same services (when not using the userns option in the compose file).

Igetin avatar Feb 19 '23 18:02 Igetin

I'm trying to get Bitnami Odoo container https://github.com/bitnami/containers/blob/main/bitnami/odoo/15/debian-11/docker-compose.yml running on MacOS (Intel) here (Podman Remote with VM) and faced the same error as @Igetin. Workaround using environment variable does not work afaik with containers using different uid's.

podman version 4.4.2, podman-compose version: 1.0.4 (commit 08ffcf6)

podman create commands that podman-compose up run have the incompatible --pod argument which can be disabled however using --no-pod like this (devel branch):

podman-compose --no-pod up

I got a bit further while hitting some other errors now but that might be worth a try. Found it here https://github.com/containers/podman-compose/issues/442 by searching through the code.

EDIT:

It does indeed run and set the userns option properly with--no-pod so that I'm able to edit volume from the container.

Simple podman command that I try to run is podman run -d -v ./html:/var/www/html --userns=keep-id:uid=1001 -p 8080:8080 --name httpd-test-keepid registry.access.redhat.com/ubi8/httpd-24:latest and testing it with compose file:

version: '2'
services:
  httpd-test-keepid:
    image: registry.access.redhat.com/ubi8/httpd-24:latest
    volumes:
      './html:/var/www/html'
    ports: '8080:8080'
    userns_mode: keep-id:uid=1001

This is ending up with the same "--userns and --pod cannot be set together" error when running podman-compose up, but podman-compose --no-pod up works fine. I haven't learned pods so far and don't understand why podman-compose tries to use them default here.

jasalt avatar Mar 19 '23 14:03 jasalt

@jasalt Did you find any solution?

I'm having the same issue, userns_mode: keep-id:uid=1001 does nothing. I do not run the devel branch.

francoism90 avatar Apr 16 '23 14:04 francoism90

I have the same question.

Akruidenberg avatar Apr 16 '23 20:04 Akruidenberg

@Akruidenberg This seems to work for me:

version: '3.9'

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    restart: on-failure
    user: ${UID:-1000}:${GID:-1000}
    working_dir: /src
    volumes:
      - ./src:/src:rw,z
    networks:
      - bridge
    depends_on:
      - mariadb
    x-podman:
      uidmaps:
        - "0:1:1"
        - "${UID:-1000}:0:1"
      gidmaps:
        - "0:1:1"
        - "${GID:-1000}:0:1"

Notice the x-podman.

francoism90 avatar Apr 16 '23 21:04 francoism90

I think this issue should be closed. As of version 1.0.6 of podman-compose, the line of userns_mode: "keep-id" in a docker compose file just works fine.

candleindark avatar May 17 '23 00:05 candleindark

@candleindark The last time I checked, this results in a creation error (as it should only be used when the container should run).

@candleindark --userns and --pod cannot be set together, so no, this has not been fixed.

francoism90 avatar May 17 '23 06:05 francoism90

Adding a +1 to this issue. userns_mode in a pod would absolutely fix all my woes with user mapping in rootless podman, none of the other user mapping solutions have worked perfectly like keep-id for userns_mode dows when not in a pod.

Is there anyone working on this error? --userns and --pod cannot be set together

If not, where should I be looking to get the right eyes on this? This is a multi year ticket that would be amazing if it was resolved.

AccaliaDeElementia avatar Apr 06 '24 16:04 AccaliaDeElementia

Podman-compose's development in general has been stale for quite time some now. I believe I read somewhere that they're planning to drop compose support at some point in favor of podman kube play. My suggestion would be to migrate to that, here's the documentation. The kube play command gained support for defining the userns option in the YAML a few months ago.

I've successfully switched my compose YAML stacks to the Kubernetes YAML format, so I can recommend it.

Igetin avatar Apr 06 '24 16:04 Igetin