amazon-web-services - 在 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/redisdata
ec2 实例上的结果,而此文件夹只是 8 GB 根挂载的一部分。如何向 Dockerrun.aws.json 添加尺寸规格?
我已经看到在 Dockerrun.aws.json 中指定“标准”挂载点的选项,但是如何确保创建了源目录并且它有足够的空间?
解决方案
到目前为止,我发现的唯一解决方案是更改 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"
}
]
} }
推荐阅读
- python - 如何检查索引 0 是否与列表中的索引 1 匹配?例如,检查用户名是否与给定的密码匹配,希望这是有意义的
- python - System.Private.CoreLib:在 Azure 函数中本地加载保存的 TensorFlow 模型时,python3 以代码 139 退出
- node.js - 如何从 Spotify Search API 获取数据并将其解析为 JSON?[在 node.js 中
- eclipse - 将 PyDev 安装到 Eclipse 时出现问题
- python - 如何检查数据帧字符串字段的python字节?
- flutter - 颤动中的动态下拉菜单,带有静态“添加新”按钮类型,如图所示
- java - 当多个类继承单个抽象类时使用构建器模式
- c++ - 如何将参数传递给从 C++ 调用的蓝图函数?
- python - 将 numpy 数组保存在 .txt 文件中
- tensorflow - 如何使 Tensorflow vid2depth 推理工作?