Можно ли заставить эту комбинацию Dockerfile / script работать без привилегий? Пытаетесь настроить NFS в контейнере RHEL7 UBI? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь настроить контейнер Docker для обслуживания некоторых файлов через NFS, но мне не удается заставить NFS работать правильно.

Вот мой файл Docker:

FROM registry.access.redhat.com/ubi7/ubi
USER root
#Add Centos Repository, matching maj/min rhel version
RUN echo $' \n\
[centos]\n\
name=CentOS-7\n\
baseurl=http://mirror.centos.org/centos/7.8.2003/os/x86_64/\n\
enabled=1\n\
gpgcheck=1\n\
gpgkey=http://mirror.centos.org/centos/7.8.2003/os/x86_64/RPM-GPG-KEY-CentOS-7' > /etc/yum.repos.d/centos.repo
RUN yum install -y nfs-utils rpcbind 
#Open NFS ports in the image
RUN echo "nfs             2049/tcp" >> /etc/services
RUN echo "nfs             111/udp" >> /etc/services
RUN mkdir -p /opt/mounttest/
RUN echo "This file is not empty." >> /opt/mounttest/mountfile
RUN chmod 777 -R /opt/mounttest/mountfile
RUN echo "/opt/mounttest/ *(ro)" >> /etc/exports
VOLUME /opt/
RUN echo "ALL" >> /etc/hosts.allow
COPY docker_entrypoint.sh .
ENTRYPOINT "/docker_entrypoint.sh"

(Как видите, я беру nfs-util из репозитория Centos, потому что в репозиториях RHEL7 для образа UBI его нет ).

У меня есть следующий сценарий точки входа, который я снял с сайта Kubernetes для запуска nfsd:

#!/bin/bash
# Copyright 2015 The Kubernetes Authors.
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

function start()
{
    unset gid
    # accept "-G gid" option
    while getopts "G:" opt; do
        case ${opt} in
            G) gid=${OPTARG};;
        esac
    done
    shift $(($OPTIND - 1))

    # prepare /etc/exports
    for i in "$@"; do
        # fsid=0: needed for NFSv4
        echo "$i *(rw,fsid=0,sync,no_subtree_check,no_root_squash)" >> /etc/exports
        if [ -v gid ] ; then
            chmod 070 $i
            chgrp $gid $i
        fi
        echo "Serving $i"
    done

    # start rpcbind if it is not started yet
    /usr/sbin/rpcinfo 127.0.0.1 > /dev/null; s=$?
    if [ $s -ne 0 ]; then
       echo "Starting rpcbind"
       /sbin/rpcbind -w
    fi

    mount -t nfsd nfsd /proc/fs/nfsd

    # -V 3: enable NFSv3
    /usr/sbin/rpc.mountd -N 2 -V 3

    /usr/sbin/exportfs -r
    # -G 10 to reduce grace time to 10 seconds (the lowest allowed)
    /usr/sbin/rpc.nfsd -G 10 -N 2 -V 3
    /sbin/rpc.statd --no-notify
    echo "NFS started"
}

function stop()
{
    echo "Stopping NFS"

    /usr/sbin/rpc.nfsd 0
    /usr/sbin/exportfs -au
    /usr/sbin/exportfs -f

    kill $( pidof rpc.mountd )
    umount /proc/fs/nfsd
    echo > /etc/exports
    exit 0
}

trap stop TERM

start "$@"

# Ugly hack to do nothing and wait for SIGTERM
while true; do
    sleep 5
done

Образ Docker успешно собирает и устанавливает nfs-util без проблем, однако когда Я запускаю контейнер Docker и получаю следующую ошибку:

$ docker run nfs-test -p 2049:2049 -p 111:111/udp --cap-add SYS_ADMIN
rpcinfo: can't contact rpcbind: : RPC: Unable to receive; errno = Connection refused
Starting rpcbind
mount: permission denied
rpc.nfsd: Unable to access /proc/fs/nfsd errno 2 (No such file or directory).
Please try, as root, 'mount -t nfsd nfsd /proc/fs/nfsd' and then restart rpc.nfsd to correct the problem
NFS started

Очевидно, проблема в том, что не удалось смонтировать / proc / fs / nfsd, но я не знаю ни причины, ни обходного пути. .

Я ограничен использованием RHEL UBI по соображениям безопасности. Если есть лучший способ подойти к настройке сервера NFS в RHEL UBI, мне также было бы интересно его услышать.

Изменить: Если я запустил контейнер Docker с помощью - -privileged решает проблему с отказом в разрешении, но я бы предпочел, если возможно, запустить изображение от имени обычного пользователя.

Итак, я немного изменяю свой вопрос: Есть ли способ успешно настроить образ сервера NFS без использования - привилегированный , и как мне нужно изменить мой запуск образа под Podman vs Docker, если мне нужно запустить привилегированный?

...