Rudolf Vesely via Podman <podman(a)lists.podman.io> writes:
> On Wednesday, February 23rd, 2022 at 09:35, Giuseppe Scrivano
<gscrivan(a)redhat.com> wrote:
>
>> Rudolf Vesely via Podman podman(a)lists.podman.io writes:
>>
>> > On Wednesday, February 23rd, 2022 at 08:52, Giuseppe Scrivano
gscrivan(a)redhat.com wrote:
>> >
>> > > Rudolf Vesely via Podman podman(a)lists.podman.io writes:
>> > >
>> > > > On Wednesday, February 23rd, 2022 at 08:17, Giuseppe Scrivano
gscrivan(a)redhat.com wrote:
>> > > >
>> > > > > Rudolf Vesely via Podman podman(a)lists.podman.io writes:
>> > > > >
>> > > > > > Hi Everybody,
>> > > > > >
>> > > > > > I tried to mount filesystem inside unprivileged
container using
>> > > > > >
>> > > > > > fuse3 and it's working. The only thing I had to do
was to mount
>> > > > > >
>> > > > > > /dev/fuse using "--device" and add
"SYS_ADMIN" capability.
>> > > > > >
>> > > > > > Example:
>> > > > > >
>> > > > > > podman run \
>> > > > > >
>> > > > > > -d \
>> > > > > >
>> > > > > > --device=/dev/fuse \
>> > > > > >
>> > > > > > --cap-add SYS_ADMIN \
>> > > > > >
>> > > > > > localhost/myimage
>> > > > > >
>> > > > > > After that I can mount fuse inside.
>> > > > > >
>> > > > > > Now I'd like to access the mounted filesystem from
another container in a pod or from the container host. In order to do that I used
"bind-propagation=rshared" like this:
>> > > > > >
>> > > > > > podman run \
>> > > > > >
>> > > > > >
--mount=type=bind,source=/from,destination=/to,bind-propagation=rshared \
>> > > > > >
>> > > > > > -d \
>> > > > > >
>> > > > > > --device=/dev/fuse \
>> > > > > >
>> > > > > > --cap-add SYS_ADMIN \
>> > > > > >
>> > > > > > localhost/myimage
>> > > > > >
>> > > > > > When I mount fuse inside the container into
"/to" or "/to/subfolder" I
>> > > > > >
>> > > > > > can again see / access the filesystem from inside of the
container but
>> > > > > >
>> > > > > > I don't see it from the host / from another
containers in a pod that
>> > > > > >
>> > > > > > mount "/from".
>> > > > > >
>> > > > > > Could you please tell me Am I missing something?
>> > > > >
>> > > > > mount points created from a rootless environment won't be
propagated to
>> > > > >
>> > > > > the host, even if you specify rshared.
>> > > > >
>> > > > > They will be propagated in the rootless mount namespace, that
you can
>> > > > >
>> > > > > access with "podman unshare".
>> > > > >
>> > > > > You first need to setup a mount point in the "podman
unshare"
>> > > > >
>> > > > > environment, e.g.:
>> > > > >
>> > > > > $ podman unshare mount --make-shared --bind /from /from
>> > > > >
>> > > > > $ podman run -v /from:/to:rshared ....
>> > > > >
>> > > > > Is the mount accessible from other containers now?
>> > > >
>> > > > Hi Giuseppe,
>> > > >
>> > > > That was my initial trial since I don't need to access it from
the
>> > > >
>> > > > host. I wanted to run two containers - the first mounting FUSE
and
>> > > >
>> > > > the second running app that accesses the mounted data.
>> > > >
>> > > > I tried to run the two containers in a pod and outside of the
pod.
>> > > >
>> > > > I tried to run the second with
>> > > >
>> > > > podman run
--mount=type=bind,source=/from,destination=/to,bind-propagation=rshared
>> > > >
>> > > > and without
>> > > >
>> > > > podman run --mount=type=bind,source=/from,destination=/to
>> > > >
>> > > > and even with
>> > > >
>> > > > podman run
--mount=type=bind,source=/from,destination=/to,bind-propagation=rshared --device=/dev/fuse
--cap-add SYS_ADMIN
>> > > >
>> > > > But the second container does not see the mounted data.
>> > > >
>> > > > And if I mount the fuse on the first to "/from/mount"
and I also
>> > > >
>> > > > "touch /from/abc" then the second container will see the
directory
>> > > >
>> > > > "/to/mount" and the file "/to/abc" but the
"/to/mount" directory will
>> > > >
>> > > > be empty.
>> > >
>> > > have you used `podman unshare mount --make-shared --bind /from /from`
>> > >
>> > > before creating the first container?
>> > >
>> > > Podman mailing list -- podman(a)lists.podman.io
>> > >
>> > > To unsubscribe send an email to podman-leave(a)lists.podman.io
>> >
>> > The fuse is mounted using rclone:
https://rclone.org/commands/rclone_mount/
>> >
>> > with option: --allow-other
>> >
>> > When I run rclone mount inside of the first container it looks like for
example this:
>> >
>> > name_of_s3_mount: on /from type fuse.rclone
(rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
>> >
>> > or when mounting as normal user inside of the container:
>> >
>> > name_of_s3_mount: on /from type fuse.rclone
(rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,allow_other)
>> >
>> > And I can confirm that in both cases, all users inside of the first
container can see the data.
>> >
>> > I've just tried inside of the first container after rclone mount:
>> >
>> > mount --make-shared --rbind /from /from
>> >
>> > and that has no effect.
>> >
>> > Forgot to mention that "/etc/fuse.conf" has
"user_allow_other" option on both host and inside of the first container.
>>
>> you need to run `podman unshare mount --make-shared --bind /from /from`
>>
>> from the host before creating the container, not from the container.
>>
>> Please be careful, the `/from` directory must be the same one you use
>>
>> for the source for the bind mount when you create the container:
>>
>> $ mkdir /tmp/from
>>
>> $ podman unshare mount --make-shared --bind /tmp/from /tmp/from
>>
>> $ podman run -d --privileged --rm -v/tmp/from:/to:rshared alpine sh -c 'mount
-t tmpfs tmpfs /to; touch /to/new-file; sleep 100'
>>
>> $ podman unshare ls /tmp/from
>>
>> new-file
>>
>> $ ls /tmp/from
>>
>> $ podman run --rm --rm -v/tmp/from:/to alpine sh -c 'ls /to'
>>
>> new-file
>>
>> The new-file is visible from the mount that can be shared among
>>
>> different containers, but it is not visible from the host.
>>
>> Podman mailing list -- podman(a)lists.podman.io
>>
>> To unsubscribe send an email to podman-leave(a)lists.podman.io
>
> Hi Giuseppe,
>
> The example is a superb explanation! Thank you very much Giuseppe. I managed to make
it work with
>
> podman unshare mount --make-shared --bind /from /from
> podman run --mount=type=bind,source=/from,destination=/to,bind-propagation=rshared
--device=/dev/fuse --cap-add SYS_ADMIN
>
> And I can see the data from host:
>
> podman unshare ls /from
>
> Or from another container
>
> podman run --volume=/from:/mnt -it --rm --name=client debian:bookworm bash
>
> Thank you very much.
>
> If I may bother you with one additional question, do you know if
"bind-propagation=rshared" can be set within Kubernetes Pod Yaml file?
>
> I tried "mountPropagation: Bidirectional" like this:
>
> ---
> apiVersion: v1
> kind: Pod
> metadata:
> name: rclone
> spec:
> containers:
> - name: app
> image: localhost/app
> volumeMounts:
> - name: dev-fuse
> mountPath: /dev/fuse
>
> - name: mydata
> mountPath: /to
> mountPropagation: Bidirectional
> securityContext:
> capabilities:
> add:
> - CAP_SYS_ADMIN
>
> volumes:
> - name: dev-fuse
> hostPath:
> path: /dev/fuse
>
> - name: mydata
> hostPath:
> type: Directory
> path: /from
>
> podman unshare umount /from # needs to be done before re-run / or just reboot
> podman unshare mount --make-shared --bind /from /from
> podman play kube file.yml
>
> And rclone is mounting properly inside but I can't see it from outside:
>
> podman unshare ls /from
>
> I'm thinking that Podman ignores "mountPropagation: Bidirectional" in
the Yaml file since reading K8s docs, the setting does
"bind-propagation=rshared".
if it doesn't behave in the same way as the example I've provided, then
it might be a bug. Could you please file an issue upstream for Podman?
looks like a bug. I've opened a PR: