首页 > 解决方案 > 在 Dockerrun.aws.json 中设置卷大小

问题描述

嘿,我正在通过弹性 beantalk 部署我的多容器 docker env。

我的 docker-compose.yml 有一个类似的条目

service:
    image: redis
    volumes:
        - redisdata:/data
volumes:
    redisdata:

通过这种方式,redisdata 的内容被持久化到磁盘并“生存”部署。

在 dockerrun.aws.json 方面,这导致

{
    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
        {
            "essential": true,
            "image": "redis",
            "mountPoints": [
                {
                    "containerPath": "/data",
                    "sourceVolume": "Redisdata"
                }
            ],
            "name": "redis"
        }
    ],
    "family": "",
    "volumes": [
        {
            "host": {
                "sourcePath": "redisdata"
            },
            "name": "Redisdata"
        }
    ]
}

现在我的问题:

ec2-instance $ df -h
/dev/xvda1      7,8G    7,7G     0  100% /
/dev/dm-3        99G     89M   94G    1% /var/lib/docker/devicemapper/mnt/2d33cb679881808fac34182bfbec8feb57bf5f65c81c51b52c3f6c9917541040

创建的卷redisdata只有 7,7 GB 大小,而 redis 容器的主根文件系统获得 99 GB。这是将此类命名卷挂载到/var/app/current/redisdataec2 实例上的结果,而此文件夹只是 8 GB 根挂载的一部分。如何向 Dockerrun.aws.json 添加尺寸规格?

我已经看到在 Dockerrun.aws.json 中指定“标准”挂载点的选项,但是如何确保创建了源目录并且它有足够的空间?

标签: amazon-web-servicesdockeramazon-ec2amazon-elastic-beanstalk

解决方案


到目前为止,我发现的唯一解决方案是更改 ebextension 配置文件。

我创建了一个.ebextensions/bla.config包含内容的文件

option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: RootVolumeSize
    value: "100"

这样,docker 容器的根卷将有 100 GB。

注意:部署此附加文件将擦除您的 ec2 实例,ec2 实例上的任何数据(包括 docker 卷)都将丢失!

编辑:添加外部 EBS 设备的附加解决方案 这是我从 AWS 支持获得的:

按照上述步骤,可以成功添加外部 EBS 设备,将其挂载到 docker 容器中。此外,我建议您考虑使用弹性文件系统 (EFS) 进行持久存储的选项。EFS 的优势在于它的存储容量是弹性的,即使环境 EC2 实例意外终止,数据也会保持不变。这是博客 [6],它提供了将 EFS 卷挂载到 Elastic Beanstalk 环境实例的步骤。

下面是用于将外部 EBS 设备(大小为 30GB)添加到 beanstalk 环境实例的 .ebextensions 配置文件。您还可以使用快照添加 EBS 卷。

[root@ip-172-31-21-181 multi-dockerapp]# cat .ebextensions/ebs.config commands:   
01mkfs:
    command: "mkfs -t ext3 /dev/sdh"   02mkdir:
    command: "mkdir /media/volume1"   03mount:
    command: "mount /dev/sdh /media/volume1"
option_settings:   
    aws:autoscaling:launchconfiguration:
        InstanceType: t2.large
        EC2KeyName: eks
        MonitoringInterval: "1 minute"
        IamInstanceProfile: "aws-elasticbeanstalk-ec2-role"
        BlockDeviceMappings: "/dev/sdh=:30,/dev/sdj=snap-51eef269"

下面是“Dockerrun.aws.json”文件的片段,它使用 sourcePath 作为“/media/volume1”创建卷

[root@ip-172-31-21-181 multi-dockerapp]# cat Dockerrun.aws.json 
{   "AWSEBDockerrunVersion":

2,   "volumes": [
    {
      "name": "php-app",
      "host": {
        "sourcePath": "/media/volume1"
      }
    },
    ....
    "containerDefinitions": [
      {
        .....
      "mountPoints": [
        {
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html"
        }
      ]
    } }

推荐阅读