我有一个 Docker 映像,它下载一个大型数据集,对其进行处理,在此过程中创建大量临时文件,然后将最终结果上传到 S3。我不需要临时文件持久化/在实例故障后仍然存在,所以我想为此使用实例存储。但出于某种原因,Docker 拒绝使用它。
在我的启动配置中,我选择了具有实例存储(c3.8xlarge)的实例类型,然后将两个实例存储卷添加为 /dev/xvdcz 和 /dev/sdb。
在用户数据中,我挂载了 sdb 卷并使其可写:
sudo mkdir /media/storage
sudo mount /dev/sdb /media/storage
sudo chmod o+rw /media/storage
在任务定义中,我创建了一个名为“InstanceStorage”的卷,其源路径为“/media/storage”,并在容器定义中,我在 /storage 为该卷添加了一个挂载点。
现在,当我在任务运行时通过 ssh 进入实例并查看主机的 /media/storage 目录时,它是空的。任务日志清楚地显示它可以写入容器的 /storage 目录。它比实例存储小得多 - 可用空间为 7.8 GB,而不是 300 GB。
我尝试手动运行 Docker 容器并附加卷:
docker run -it -v /media/storage:/storage --entrypoint /bin/sh my-docker-image:latest
相同的行为:我可以写入/storage,文件甚至可以在退出并重新启动 Docker 容器后继续存在,但它太小了,并且我在容器内的 /storage 中创建的任何文件都不存在于主机上的 /media/storage 中。
查看主机和容器的 df -h 可以清楚地看到它安装了 /dev/xvda1—— 该卷还存储了docker镜像。
主持人:
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7,8G 848M 6,9G 11% /
devtmpfs 30G 88K 30G 1% /dev
tmpfs 30G 0 30G 0% /dev/shm
/dev/xvdb 315G 67M 299G 1% /media/storage
容器:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-(...) 9.8G 1.1G 8.2G 12% /
tmpfs 30G 0 30G 0% /dev
tmpfs 30G 0 30G 0% /sys/fs/cgroup
/dev/xvda1 7.8G 848M 6.9G 11% /storage
shm 64M 0 64M 0% /dev/shm
为什么会这样呢?
答案1
我终于找到了解决方案。此脚本为我指明了正确的方向。
您需要重新启动Docker服务。
显然,Docker 在执行用户数据脚本之前启动,并且它只能访问服务启动时挂载的卷。
因此我将其添加到我的用户数据脚本的末尾,并修复了它:
sudo service docker restart