Visitar URL original
Permission issue with rootless containers · Issue #1243 · pre-commit/pre-commit · GitHub
Skip to content

Permission issue with rootless containers #1243

Description

@dkolepp

I tried to use a docker_image hook on a RHEL7.7 system using podman with the podman-docker package installed [This setup allows for rootless containers]. The hook attempts to modify the file, but gets a "permission denied" error. From looking at the source code, I see that pre-commit is roughly trying to execute:

docker run -u $(id -u):$(id -g)  -v $(pwd):/src:rw,Z --workdir /src -it <ENTRY> <FILE>

The hook does try to run, but results in permission error.
image

If, however, I remove the -u option from the source code (locally, languages/docker.py, docker_cmd()), then the hook runs fine:
image

Activity

  1. asottile commented on Dec 16, 2019

    @asottile
    Member

    sounds like podman is doing an non-compliant thing

    without -u the files become owned by root which isn't really ok

    I'm inclined to close this as wontfix, thoughts?

  2. dkolepp commented on Dec 16, 2019

    @dkolepp
    Author
  3. dkolepp commented on Dec 16, 2019

    @dkolepp
    Author
  4. asottile commented on Dec 16, 2019

    @asottile
    Member

    Right, that's not how docker works though, so if this is attempting to emulate docker's cli it is doing so without complying to docker's approach

  5. dkolepp commented on Dec 16, 2019

    @dkolepp
    Author

    What about if the local docker daemon is setup as so: https://docs.docker.com/engine/security/rootless/

    Pretty sure the above approach by docker is using the same set of linux kernel features that podman is using. Rootless containers are a must for any one that is security-minded.

  6. asottile commented on Dec 16, 2019

    @asottile
    Member

    no idea, can you try it and report back?

  7. dkolepp commented on Dec 16, 2019

    @dkolepp
    Author

    Yep - I'll give it go!

  8. dkolepp commented on Dec 17, 2019

    @dkolepp
    Author

    Update: I installed docker 19.03 on Centos 7.7 using the instructions found here: https://docs.docker.com/engine/security/rootless/#prerequiresites

    This allows the docker daemon to run as a non-root user. This mode allows the docker daemon to be installed in user space, and does not require privileges to install or run the docker daemon, as long as certain prerequisites are satisfied.

    With this type of install, the exact same issue is observed as with (rootless) podman.

  9. asottile commented on Dec 17, 2019

    @asottile
    Member

    do you have a suggestion as to how to detect / avoid this then? and would you be willing to submit a PR addressing it?

  10. dkolepp commented on Dec 17, 2019

    @dkolepp
    Author

    I'm happy to submit a PR. Would like some ideas about what is "acceptable" for a contribution. As you say, ideally there is some way to detect rootless vs privileged, and then adjust the associated docker command accordingly.

    If that's not the case (that there's not an easy way to detect rootless mode), are there other options available? Environment variables? user configuration file for the pre-commit executable itself?

  11. dkolepp commented on Dec 17, 2019

    @dkolepp
    Author

    Update: podman system info produces a YAML file that has a readable key for "rootless". Am going to check docker for this too...

  12. asottile commented on Dec 17, 2019

    @asottile
    Member

    ideally just detect and adjust, if that's not an option this is probably wontfix -- there is currently no configuration and I'd like to keep it that way

    and perhaps document putting a docker executable on the PATH in this case which drops -u argument (since it's completely non-functional)

    this does seem like a bug in docker though, --user seems completely nonfunctional in "rootless" 🤔 -- I wonder if this should be reported as well to their tracker(s)

  13. dkolepp commented on Dec 17, 2019

    @dkolepp
    Author

    This is intentional moving forward with containers - that all containers are set to UID 0 inside the container, and the container runtime takes care of security and sandoxing the "root" user of the container. By applying a context, you limit the privileges of the container to the context in which that container is run: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

    Also, docker has a similar interface: docker system info that provides a rootless-enabled flag...

  14. asottile commented on Dec 17, 2019

    @asottile
    Member

    I'm not sure how kubernetes design decisions are "this is how containers are from now on", could you elaborate? I'm afraid you're making unsubstantiated claims or projecting one project's decisions on the entire concept of containers.

  15. 18 remaining items

  16. themr0c commented on Jun 3, 2020

    @themr0c
    Contributor

    I will need even more help to write a test for the coverage: :/

    py38 run-test: commands[2] | coverage report
    pre_commit/languages/docker.py      64      3      8      1    92%   89->90, 90-92
    

    But let's see first if the implementation is acceptable.

  17. aryx commented on Oct 7, 2022

    @aryx

    Why does pre-commit pass a -u with the current userid to docker_container?
    We get some permission denied in the container because my locao userid has nothing to do with the user id in the container.
    Wouldn't it be simpler to just not pass any -u?

  18. asottile commented on Oct 7, 2022

    @asottile
    Member

    because things can write and then you'd have to deal with root owned files on the host

  19. asottile commented on Jun 4, 2024

    @asottile
    Member

    @kapsh yeah of course did you read the thread?

  20. diamond-deluxe commented on Jul 20, 2024

    @diamond-deluxe
  21. asottile commented on Jul 20, 2024

    @asottile
    Member

    @diamond-deluxe please don't bump threads like that -- if you're interested in the current state: read the thread, if you're interested in future updates: click subscribe, if you like the issue use the reactions -- but please don't comment and send an email to everyone subscribed without any additional helpful information

  22. alexander-bauer commented on Sep 13, 2024

    @alexander-bauer

    For anyone arriving here in search of a workaround, my approach was to write this script to replace the docker script supplied through podman-docker, and install it as $HOME/.local/bin/docker.

    To be clear, this is a horrible hack, but worked to get my hooks running in lieu of an upstream solution.

    #!/bin/bash
    [ -e /etc/containers/nodocker ] || \
    echo "Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg." >&2
    
    # Check for and drop -u flag -- workaround to https://github.com/pre-commit/pre-commit/issues/1243
    args=() # declare array
    while [[ "$#" -gt 0 ]]; do
      if [[ "$1" == "-u" || "$1" == "--user" ]]; then
        echo "Dropping arguments '$1 $2' before passing to podman" >&2
        shift 2
      else
        args+=("$1")
        shift 1
      fi
    done
    
    exec /usr/bin/podman "${args[@]}"
  23. zware commented on Jan 21, 2025

    @zware

    Just to note, I'm not convinced that the existing -u option passed by pre-commit is doing anybody any good. Even with it, I wind up with files created by a docker_image hook owned by either root (if using non-rootless Docker) or another random uid (using either podman with podman-docker or rootless Docker). In general, arbitrary images don't actually have the given uid/gid available anyway, unless explicitly added.

  24. asottile commented on Jan 21, 2025

    @asottile
    Member

    for rootful it's definitely the correct thing to do. an image doesn't need a user configured to run as that uid and otherwise the files are owned as root

    if you're ending up with root files then your image must be doing that intentionally

  25. kastl-ars commented on May 19, 2025

    @kastl-ars

    Sorry for chiming in. I tried to understand what was discussed in this issue and the many other discussions on this topic.
    To me it seems like this is still a problem (which I am running into currently AFAICS). Is there a switch, configuration file option or similar yet to tell pre-commit that it deals with rootless podman?

    (Using the workaround in #1243 (comment) works, but is a workaround...)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions