【问题标题】:Docker: Additional property pull_policy is not allowedDocker:不允许附加属性 pull_policy
【发布时间】:2021-09-06 23:00:33
【问题描述】:

大家好,请原谅我的英语。当我尝试使用此命令部署 docker 应用程序时,我正在使用 docker swarm

docker stack deploy -c docker-compose.yml -c docker-compose.prod.yml chatappapi

显示下一个错误services.chat-app-api Additional property pull_policy is not allowed

为什么会这样? 我该如何解决?

docker-compose.yml

version: "3.9"
services:
    nginx:
        image: nginx:stable-alpine 
        ports: 
            - "5000:80"
        volumes:
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    chat-app-api:
        build: .
        image: username/myapp
        pull_policy: always
        volumes:
            - ./:/app
            - /app/node_modules
        environment: 
            - PORT= 5000
            - MAIL_USERNAME=${MAIL_USERNAME}
            - MAIL_PASSWORD=${MAIL_PASSWORD}
            - CLIENT_ID=${CLIENT_ID}
            - CLIENT_SECRET=${CLIENT_SECRET}
            - REDIRECT_URI=${REDIRECT_URI}
            - REFRESH_TOKEN=${REFRESH_TOKEN}
        depends_on: 
            - mongo-db
    mongo-db:
        image: mongo
        environment: 
            MONGO_INITDB_ROOT_USERNAME: 'username'
            MONGO_INITDB_ROOT_PASSWORD: 'password'
        ports:
            - "27017:27017"
        volumes: 
            - mongo-db:/data/db
volumes: 
    mongo-db:

docker-compose.prod.yml

version: "3.9"
services: 
    nginx:
        ports: 
            - "80:80"
    chat-app-api:
        deploy:
            mode: replicated
            replicas: 8
            restart_policy:
                condition: any
            update_config:
                parallelism: 2
                delay: 15s
        build:
            context: .
            args: 
                NODE_ENV: production
        environment: 
            - NODE_ENV=production
            - MONGO_USER=${MONGO_USER}
            - MONGO_PASSWORD=${MONGO_PASSWORD}
            - MONGO_IP=${MONGO_IP}
        command: node index.js
    mongo-db:
        environment: 
            MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
            MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}

信息

  • docker-compose 版本 1.29.2
  • Docker 版本 20.10.8
  • Ubuntu 20.04.2 LTS

提前致谢。

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    你的问题在docker-compose.yml

    chat-app-api:
        build: .
        image: username/myapp
        pull_policy: always    # <== this is the bad line, delete it
    

    docker compose file reference 在 api 中没有任何 pull_policy,因为

    如果图像不存在,Compose 会尝试拉取它,除非您还指定了构建,在这种情况下,它使用指定的选项构建它并使用指定的标签对其进行标记。

    我认为pull_policy 曾经是作曲的东西?也许在开发过程中保持最新的 api 文档开放以供参考/搜索(使用 compose 可以并且确实经常改变)。

    如果您想确保将最新版本的图像拉到一个集群中的所有服务器上,然后在每个服务器上依次运行docker compose -f ./docker-compose.yml pull(docker stack 还没有在整个集群上运行它的功能)。

    顺便说一句:如果没有充分的理由,我不会将两个 .yml 文件与单个 docker stack 命令合并。

    【讨论】:

      【解决方案2】:

      你在同一个文件中混合了 docker-compose 和 docker swarm 的想法:

      可能值得将您的项目分成 3 个文件:

      docker-compose.yml 这将只包含 compose 和 swarm 通用的基本服务定义。

      docker-compose.override.yml 方便的是,docker-compose 和 docker compose 都应该自动读取这个文件。此文件应包含任何“port:”、“depends_on:”、“build:”指令以及用于开发的任何便利卷。

      stack.production.yml 在堆栈部署中使用的覆盖文件应该包含 swarm 理解的所有内容,而不是 compose,并且 b.生产所需的一切。 在这里,您将使用configs: 甚至secrets: 而不是到本地文件夹的卷映射来将内容注入容器。与其依赖ports: 指令,不如在swarm 上安装一个入口路由器,例如traefik。等等。

      通过这种安排,docker compose 可用于在本地开发和构建您的撰写堆栈,并且docker stack deploy 不必暴露于它不理解的撰写语法。

      【讨论】:

        【解决方案3】:

        pull_policy 在最新版本的 docker-compose 中。

        要升级您的 docker-compose,请参阅: https://docs.docker.com/compose/install/

        更多信息的规范: https://github.com/compose-spec/compose-spec/blob/master/spec.md#pull_policy

        【讨论】:

          猜你喜欢
          • 2021-11-18
          • 2017-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 2023-01-10
          • 1970-01-01
          相关资源
          最近更新 更多