Назад | Перейти на главную страницу

ведро хранилища Google-Cloud, подключенное к службе докеров

Я пытаюсь добиться следующего:

Я хочу смонтировать ведро 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), не может получить доступ к локально смонтированному ведру. Я нашел два возможных решения:

  1. Используйте пользователя root внутри jenkins-container (не очень)
  2. Установите ведро прямо внутри контейнера.

На данный момент я не уверен, какое решение буду использовать, поскольку ни одно из них меня не устраивает. Очевидно, что запуск jenkins от имени root не является хорошим решением, но я также не хочу предоставлять ключ доступа Google-API в контейнере, доступном для Интернета.