使用SaltStack官方Docker Formula部署1Password Connect容器时Docker卷挂载异常求助
排查SaltStack Docker Formula卷挂载异常问题
我仔细排查了你的Pillar配置和问题细节,发现两个核心问题导致了卷挂载异常:
1. Pillar配置存在语法错误
看你op-connect-sync容器的binds配置,两个挂载项的引号都不配对:
binds: - /home/kevinadmin/1password-credentials.json:/home/opuser/.op/1password-credentials.json" - data:/home/opuser/.op/data"
第一个挂载项开头缺双引号、结尾多了引号;第二个同样结尾多了双引号。这种语法错误会让Salt解析Pillar时出现异常,直接忽略了凭证文件的挂载配置,甚至会干扰共享卷的关联逻辑。
2. Compose结构不符合Salt Docker Formula的预期
Salt的Docker Formula对Compose配置的层级有明确要求:所有容器服务必须放在services节点下,共享卷定义要放在volumes节点下,且二者都归属于一个统一的Compose项目(比如命名为1password-connect)。你当前的配置直接把容器名放在docker.compose根节点下,没有遵循这个结构,导致Formula无法识别到两个容器需要共享同一个data卷,因此为每个容器单独创建了独立卷。
修复后的完整Pillar配置
docker: containers: running: - op-connect-api - op-connect-sync op-connect-api: image: "1password/connect-api:latest" op-connect-sync: image: "1password/connect-sync:latest" compose: 1password-connect: # 定义统一的Compose项目名称 services: op-connect-api: hostname: "op-connect-api.domain.local" ports: "8080:8080" binds: - "/home/kevinadmin/1password-credentials.json:/home/opuser/.op/1password-credentials.json" - "data:/home/opuser/.op/data" op-connect-sync: hostname: "op-connect-sync.domain.local" binds: - "/home/kevinadmin/1password-credentials.json:/home/opuser/.op/1password-credentials.json" - "data:/home/opuser/.op/data" volumes: data: # 共享卷定义在项目的volumes节点下
验证与清理步骤
- 先清理之前生成的错误独立卷:
docker volume rm $(docker volume ls -q | grep data) - 刷新Minion的Pillar配置:
salt '<你的MinionID>' saltutil.refresh_pillar - 执行Docker状态部署:
salt '<你的MinionID>' state.apply docker - 部署完成后,用
docker inspect <容器ID>检查Volumes字段,应该同时显示凭证文件和共享卷的挂载记录;再用docker volume ls查看,只会生成一个1password-connect_data卷(由项目名+卷名组合而成),两个容器会共用这个卷实现文件交换。
另外,关于凭证文件的权限,虽然你设置了777,但如果后续出现容器无法读取的情况,可以尝试将文件属主改为容器内opuser的UID(可通过docker run --rm 1password/connect-api id -u opuser查询)。
内容的提问来源于stack exchange,提问作者Woask
相关产品推荐
相关产品推荐

