0

我正在尝试使用 ECS + EFS(个人站点的 MySQL)进行 POC,但是 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。

4

2 回答 2

1

原来是因为:

如果您使用的是 Amazon ECS-Optimized AMI 或 Amazon Linux AMI 的 docker 程序包,则 Docker 守护程序的挂载命名空间在启动时与主机不共享。其他一些 AMI 也可能有这种行为。在其中任何一个上,文件系统挂载都不会传播到 Docker 守护程序,直到下次重新启动。

所以跑步sudo service docker restart && sudo start ecs解决了它。

于 2017-05-06T14:19:12.087 回答
0

当您启动 EC2 实例时,您可以指定在启动时运行的“用户数据”脚本,在 docker 启动之前

在你的情况下,这样的事情应该有效:

#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
于 2017-07-31T17:52:16.107 回答