Я пытаюсь запустить RabbitMQ в Nomad с помощью Docker. Однако я столкнулся с некоторыми проблемами, связанными с разрешениями. При попытке запустить задание в Nomad я получаю следующую ошибку:
sed: preserving permissions for ‘/etc/rabbitmq/sedpR1m3w’: Operation not permitted
sed: preserving permissions for ‘/etc/rabbitmq/sedEc0Idz’: Operation not permitted
/usr/local/bin/docker-entrypoint.sh: line 250: /etc/rabbitmq/rabbitmq.conf: Permission denied
touch: cannot touch '/etc/rabbitmq/rabbitmq.conf': Permission denied
WARNING: '/etc/rabbitmq/rabbitmq.conf' is not writable, but environment variables have been provided which request that we write to it
We have copied it to '/tmp/rabbitmq.conf' so it can be amended to work around the problem, but it is recommended that the read-only source file should be modified and the environment variables removed instead.
/usr/local/bin/docker-entrypoint.sh: line 250: /tmp/rabbitmq.conf: Permission denied
или эта ошибка:
chmod: changing permissions of '/var/lib/rabbitmq/.erlang.cookie': Operation not permitted
У меня есть настроенные тома, чтобы можно было сохранить данные RabbitMQ. Эти тома указывают на общий ресурс SMB на компьютере Windows Server в другом месте сети.
Я добавил следующее в /etc/ftstab для автоматической установки:
//DC02/Nomad /mnt/winshare cifs credentials=/home/linuxnomad/.smbcreds,uid=995,gid=993,file_mode=0777,dir_mode=0777 0 0
Вот как выглядит спецификация вакансии:
job "rabbitmq03" {
datacenters = ["techtest"]
type = "service"
constraint {
attribute = "${attr.kernel.name}"
value = "linux"
}
constraint {
attribute = "${attr.unique.hostname}"
value = "nomadlinux03"
}
group "rabbitmq" {
network {
mode = "cni/prod"
hostname = "RabbitMqNOMAD03"
}
service {
name = "${JOB}"
port = 5672
address_mode = "alloc"
check {
type = "http"
port = 15672
path = "/api/health/checks/local-alarms"
interval = "3s"
timeout = "2s"
address_mode = "alloc"
header {
Authorization = ["Basic Z3Vlc3Q6Z3Vlc3Q = "]
}
}
}
task "rabbitmq" {
driver = "docker"
config {
privileged = false
image = "rabbitmq:3.8.12-management"
auth_soft_fail = true
volumes = [
"/mnt/winshare/RabbitMQ03/data:/var/lib/rabbitmq/mnesia",
"/mnt/winshare/RabbitMQ03/config:/etc/rabbitmq",
"/mnt/winshare/RabbitMQ03/log:/var/log/rabbitmq"
]
}
env {
HOSTNAME = "RabbitMqNOMAD"
RABBITMQ_DEFAULT_USER = "guest"
RABBITMQ_DEFAULT_PASS = "guest"
RABBITMQ_ERLANG_COOKIE = "testsecret"
}
resources {
cpu = 1001
memory = 6144
}
}
}
}
Я обязательно подключил общий ресурс SMB с правами пользователя Nomad, поэтому я ожидаю, что все будет в порядке, но, возможно, я что-то упускаю?





Я обязательно подключил общий ресурс SMB с правами пользователя Nomad.
Вы используете докер-контейнер. Права пользователя Nomad не имеют значения, если он может получить доступ к демону Docker.
возможно я что-то упускаю?
У Samba и cifs свои разрешения, и вы заставляете uid=995,gid=993,file_mode=0777,dir_mode=0777.
Изучите docker-контейнеры и что такое виртуализация пользователей. Ваша ошибка не связана с Nomad. Изучите разрешения Samba, а также конкретный Docker-контейнер и приложение, которое вы используете, т. е. Docker-контейнер Rabbitmq:3.8.12-management, какие разрешения он ожидает. Кроме того, изучите стандартную модель разрешений файлов Linux.
(Кроме того, я думаю, что привязка подкаталога монтирования CIFS может работать не так, как ожидалось, но это предположение.)
Контейнер меняется на пользователя RabbitMQ в точке входа https://github.com/docker-library/rabbitmq/blob/master/docker-entrypoint.sh#L10 .
Я перешел с Samba на NFS, чтобы устранить как можно больше проблем с разрешениями. Я все еще получаю ошибки, связанные с разрешениями. Затем я понял, что контейнер работает от имени пользователя root, но RabbitMQ работает с пользователем и группой RabbitMQ. Итак, после исправления прав доступа к общим папкам все теперь работает :)