我在 Windows Server 2022 上托管了一个 Docker 集群。我创建了一个credentialspec
文件,因为我需要该服务使用甲基磺酸。我还定义了一个撰写文件来启动我的服务:
version: '3.8'
services:
agent:
image: privaterepo.local/devops-agent-win-generic:latest
hostname: '${AZPOOL}_Generic-{{.Task.Slot}}'
user: "NT AUTHORITY\\NETWORK SERVICE"
security_opt:
- "credentialspec=file://domain_devopsagent.json"
environment:
AZP_URL: ${AZURL}
AZP_POOL: ${AZPOOL}
AZP_TOKEN: ${AZTOKEN}
AZP_ONCE: ${AZONCE:-false}
AZP_REMOVE: ${AZREMOVE:-true}
deploy:
replicas: 2
placement:
constraints: [node.platform.os == windows]
这将使容器正常启动(没有错误),并且容器似乎按NETWORK SERVICE
预期运行,但它们无法按预期访问网络共享。
如果我手动运行容器,那么容器确实可以访问网络共享。
docker run --rm -it --user "NT AUTHORITY\NETWORK SERVICE" --security-opt "credentialspec=file://domain_devopsagent.json" privaterepo/devops-agent-win-generic:latest
这使我相信,无论是组合定义还是 Docker Swarm 处理组合定义的方式都存在问题。
我也尝试使用该credentialspec=raw://<json>
版本 - 容器启动正常,但和以前一样无法访问网络共享。
知道什么地方出了问题吗?
答案1
我显然错过了关于 Compose 文件结构文档的一个关键部分(特别是这部分)。
最终定义应如下所示:
version: '3.8'
services:
agent:
image: privaterepo.local/devops-agent-win-generic:latest
hostname: '${AZPOOL}_Generic-{{.Task.Slot}}'
user: "NT AUTHORITY\\NETWORK SERVICE"
credential_spec:
config: credspec
environment:
AZP_URL: ${AZURL}
AZP_POOL: ${AZPOOL}
AZP_TOKEN: ${AZTOKEN}
AZP_ONCE: ${AZONCE:-false}
AZP_REMOVE: ${AZREMOVE:-true}
deploy:
replicas: 2
placement:
constraints: [node.platform.os == windows]
configs:
credspec:
external: true
启动上述操作之前,需要通过(应包含原始 credspec 文件 JSON)credspec
在 swarm 中创建配置。docker config create