ECS + EFS - 文件永远不会离开容器
ECS + EFS - files never make their way out of the container
我正在尝试使用 ECS + EFS 进行 POC(MySQL 用于个人站点),但是 docker 内对已安装卷的文件更改没有成功EFS.
我已经把它挂载到容器主机上了:
us-east-1a.fs-#####.efs.us-east-1.amazonaws.com:/ on /mnt/mysql-data-docker type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.128,local_lock=none,addr=10.0.0.90)
我的任务定义(相关部分)显示:
"mountPoints": [
{
"containerPath": "/var/lib/mysql",
"sourceVolume": "mysql-data",
"readOnly": null
}
]
和
"volumes": [
{
"host": {
"sourcePath": "/mnt/mysql-data-docker"
},
"name": "mysql-data"
}
],
我可以在那里写一个文件,终止主机,让新主机通过缩放组出现并挂载,文件仍然在那里,所以我知道这是有效的(EFS 在那个 FS 上显示 12kb 而不是6kb).
查看 运行 MySQL 容器:
[ec2-user@ip-10-0-0-128 ~]$ docker inspect e96a7 | jq '.[0].Mounts'
[
{
"Source": "/mnt/mysql-data-docker",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
主机上的 /mnt/mysql-data-docker
只显示我验证过的测试文件。在容器中,/var/lib/mysql
中有一堆东西,但它从未进入主机或 EFS。
原来是因为:
If you're using the Amazon ECS-Optimized AMI or Amazon Linux AMI's docker packages, the Docker daemon's mount namespace is unshared from the host's at launch. Some other AMIs might also have this behaviour.
On any of those, a filesystem mount will not propagate to the Docker daemon until the next time it's restarted.
所以运行sudo service docker restart && sudo start ecs
解决了。
启动 EC2 实例时,您可以在 docker 启动
之前指定启动时 运行 的 "user data" 脚本
在你的情况下,像这样的事情应该有效:
#cloud-boothook
#!/bin/bash
# Install nfs-utils
sudo yum install -y nfs-utils
# Mount EFS, writing the volume to fstab ensures it will automatically mount even on reboot
sudo mkdir -p /mnt/mysql-data-docker
sudo echo "us-east-1a.fs-#####.efs.us-east-1.amazonaws.com:/ /mnt/mysql-data-docker nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2" >> /etc/fstab
sudo mount -a
我正在尝试使用 ECS + EFS 进行 POC(MySQL 用于个人站点),但是 docker 内对已安装卷的文件更改没有成功EFS.
我已经把它挂载到容器主机上了:
us-east-1a.fs-#####.efs.us-east-1.amazonaws.com:/ on /mnt/mysql-data-docker type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.128,local_lock=none,addr=10.0.0.90)
我的任务定义(相关部分)显示:
"mountPoints": [
{
"containerPath": "/var/lib/mysql",
"sourceVolume": "mysql-data",
"readOnly": null
}
]
和
"volumes": [
{
"host": {
"sourcePath": "/mnt/mysql-data-docker"
},
"name": "mysql-data"
}
],
我可以在那里写一个文件,终止主机,让新主机通过缩放组出现并挂载,文件仍然在那里,所以我知道这是有效的(EFS 在那个 FS 上显示 12kb 而不是6kb).
查看 运行 MySQL 容器:
[ec2-user@ip-10-0-0-128 ~]$ docker inspect e96a7 | jq '.[0].Mounts'
[
{
"Source": "/mnt/mysql-data-docker",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
主机上的 /mnt/mysql-data-docker
只显示我验证过的测试文件。在容器中,/var/lib/mysql
中有一堆东西,但它从未进入主机或 EFS。
原来是因为:
If you're using the Amazon ECS-Optimized AMI or Amazon Linux AMI's docker packages, the Docker daemon's mount namespace is unshared from the host's at launch. Some other AMIs might also have this behaviour. On any of those, a filesystem mount will not propagate to the Docker daemon until the next time it's restarted.
所以运行sudo service docker restart && sudo start ecs
解决了。
启动 EC2 实例时,您可以在 docker 启动
之前指定启动时 运行 的 "user data" 脚本在你的情况下,像这样的事情应该有效:
#cloud-boothook
#!/bin/bash
# Install nfs-utils
sudo yum install -y nfs-utils
# Mount EFS, writing the volume to fstab ensures it will automatically mount even on reboot
sudo mkdir -p /mnt/mysql-data-docker
sudo echo "us-east-1a.fs-#####.efs.us-east-1.amazonaws.com:/ /mnt/mysql-data-docker nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2" >> /etc/fstab
sudo mount -a