Docker-compose:如何在版本3中实现版本2的"mem_limit"?

3

最近,我尝试将一个版本为2docker-compose yaml文件升级到3版本。具体来说,我从2.1版本升级到了3.4版本。使用的是docker-compose 1.18.0版本和docker 18.06.01版本。

第一次尝试由于存在Version 2选项mem_limit而导致docker-compose中止。通过阅读这些 Version 3文档,它明确说明已删除mem_limit选项,并建议查看“升级”指南以避免使用该选项。这些指示告诉您使用deploy部分和resources。对docker-compose.yml文件进行这些更改后,系统正常启动。

很遗憾,我错过了免责声明,其中指出 deploy 将被 docker-compose 忽略!我的问题是:是否有一种方法可以在使用Compose文件引用3和 docker-compose 的同时仍强制执行容器内存限制?

他们非常明确:v3 适用于 Swarm 和 Kubernetes。您不能仅使用 v3 限制内存,而不是 Swarm,并应继续使用 v2。更多信息请阅读此线程。 https://github.com/docker/compose/issues/4513 - Titouan Freville
终于阅读了足够多的文件,是的,它在里面,虽然我完全同意下面所选答案 - 它确实不算“非常清晰”! - JoeG
2个回答

7
没有,没有任何升级理由,如果您不使用swarm的话,甚至不需要升级。在2.x和3.x版本之间...移除了几个选项,如mem_limitmemswap_limit,这些选项被替换为deploy下的resources key配置,仅当使用docker stack deploy时,deploy配置才会生效,并且被docker-compose忽略。请参见Compose: Upgrading from 2 to 3。遗憾的是,在官方的docker文档中,声明了:

Version 3 (most current, and recommended)

如果你使用docker-compose而不使用swarm,那么几乎没有理由去切换或在新项目中使用v3。在官方存储库中,你可以看到像这样的评论[2][3]。同样,在compatibility-matrix中,即使v3已经发布了很长时间,仍然可以看到v2得到升级。只有v1被标记为弃用。

谢谢 - 虽然我不喜欢这个答案,但我并不知道这是真的。不幸的是,我相信“start_period”('healthcheck'下的新选项)只支持V3,我真的想使用它,但不想以失去内存限制为代价! - JoeG
1
补充我的上一个评论 - 如果我使用版本2.3或更高版本与Compose,则我想要的选项start_period是可用的。 - JoeG

0
这是一个带有内存限制的 Docker Compose 文件版本 3.8 的示例:
version: '3.8'

services:
  web:
    image: nginx:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
      resources:
        limits:
          memory: 256M
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: myapp-data
        target: /var/www/html
    networks:
      - myapp-net
    environment:
      - NGINX_HOST=example.com
      - NGINX_PORT=80

  db:
    image: mysql:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      resources:
        limits:
          memory: 512M
    volumes:
      - type: volume
        source: myapp-db
        target: /var/lib/mysql
    networks:
      - myapp-net
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=myapp

volumes:
  myapp-data:
  myapp-db:

networks:
  myapp-net:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接