Я пытаюсь настроить контейнер 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, если мне нужно запустить привилегированный?