Docker: 不允许附加属性 pull_policy

Docker: Additional property pull_policy is not allowed

大家好,请原谅我的英语不好。当我尝试使用此命令

部署 docker 应用程序时,我正在使用 docker 群

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.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 因为

If the image does not exist, Compose attempts to pull it, unless you have also specified build, in which case it builds it using the specified options and tags it with the specified tag.

我认为 pull_policy 曾经是写作的东西 ?也许保持最新的 api 文档处于打开状态,以便在您进行开发时参考 to/search(使用 compose 可以并且确实经常更改)。

如果你想确保将最新版本的图像拉到集群中的所有服务器上,那么 运行 docker compose -f ./docker-compose.yml pull 依次在每个服务器上(docker 堆栈不运行 还没有在整个群中使用此功能)。

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

您正在将 docker-compose 和 docker 大量想法混合在同一个文件中:

可能值得将您的项目分成 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 可用于在本地开发和构建您的 compose 堆栈,并且 docker stack deploy 不必暴露于它不理解的 compose 语法。

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