我正在尝试实现以下目标:
我想将 google-storage 存储桶作为文件系统本地安装到我的 docker swarm 工作器上。所有 swarm 工作器都具有对 google 存储 API 的必要访问权限。
存储桶在实例创建时安装。
之后,在部署服务时,该服务应该能够写入存储桶。
目标:
该服务应该能够在标签组内的任何工作器上运行。R/W 锁定不是问题。该服务仅运行一次。
我不想在容器内安装存储桶,因为我想尽量减少开销和容器尺寸。
问题:
我可以很好地在本地访问、读取和写入文件系统。
但是,当容器尝试写入已挂载的文件系统时,我可以从日志中看到它不能(权限被拒绝)
我已经尝试检查这是否是 docker swarm 的问题或者无法以特权模式运行容器,但是当我在特权模式下本地运行容器时,会出现相同的行为。
我想知道是否有办法通过这种方式实现我的目标,或者我是否需要重新考虑不直接从容器内安装存储桶。
Docker 版本 17.03.1-ce
Docker 信息
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
答案1
我自己解决了这个问题并想与大家分享以防有人遇到相同或类似的问题。
jenkins-container(又名 jenkins)中使用的用户无法访问本地挂载的 bucket。我发现了两个可能的解决方案:
- 在 jenkins-container 中使用 root 用户(不太好)
- 将桶直接安装在容器内
目前,我不确定要使用哪种解决方案,因为我对这两种解决方案都不满意。显然,以 root 身份运行 jenkins 不是一个好的解决方案,但我也不想在暴露于互联网的容器中提供 Google-API 访问密钥。