Я пытаюсь добиться следующего:
Я хочу смонтировать ведро Google-хранилища для моих рабочих роя докеров локально в качестве файловой системы. У всех Swarm-worker есть необходимые права доступа к API хранилища Google.
Ведро монтируется при создании экземпляра.
Впоследствии, при развертывании службы, эта служба должна иметь возможность записи в ведро хранения.
Цель:
Сервис должен иметь возможность запускаться на любом из рабочих в группе тегов. R / W-блокировка не является проблемой. Служба запускается только один раз.
Я бы предпочел не монтировать ведро внутри контейнера, так как я хочу минимизировать накладные расходы и размер контейнера.
Проблема:
Я могу получить доступ, читать и записывать в файловую систему локально просто отлично.
Однако, когда контейнер пытается записать в смонтированную файловую систему, я вижу из журналов, что он не может (в разрешении отказано)
Я уже пытался проверить, связана ли это с docker swarm или невозможностью запускать контейнеры в привилегированном режиме, но то же самое поведение возникает, когда я запускаю контейнер локально в привилегированном режиме.
Я хотел бы знать, есть ли способ достичь моей цели таким образом, или мне нужно переосмыслить, не устанавливая ведро непосредственно из контейнера.
Докер-версия 17.03.1-в.
Информация о докере
Server Version: 17.03.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: active
NodeID: wcq01hi8zfzofs6elnxdfswm9
Is Manager: false
Node Address: 10.132.16.15
Manager Addresses:
10.132.16.2:2377
10.132.16.3:2377
10.132.16.4:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.8.0-32-generic
Operating System: Ubuntu 16.10
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.755 GiB
Name: persistent-worker-8rrl
ID: 4H6O:BBPD:ZMSE:OKWE:QZQS:P5BT:CXFH:VAG5:MNDU:A5ZM:V2O5:TKQH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Параметр создания службы
docker service create \
--constraint 'node.labels.availability == persistent' \
--mount type=bind,source=/mnt/storage-bucket/jenkins,destination=/var/jenkins_home \
--name jenkins \
--replicas=1 \
jenkinsci/jenkins
Команда выполнения
sudo docker run \
--privileged \
--volume /mnt/storage-bucket/jenkins:/var/jenkins_home \
-d \
jenkinsci/jenkins
Я понял это сам и подумал, что поделюсь, если кто-то столкнется с той же или подобной проблемой.
Пользователь, который используется в jenkins-container (также известный как jenkins), не может получить доступ к локально смонтированному ведру. Я нашел два возможных решения:
На данный момент я не уверен, какое решение буду использовать, поскольку ни одно из них меня не устраивает. Очевидно, что запуск jenkins от имени root не является хорошим решением, но я также не хочу предоставлять ключ доступа Google-API в контейнере, доступном для Интернета.