首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性豆杆上的码头nfs4安装

弹性豆杆上的码头nfs4安装
EN

Stack Overflow用户
提问于 2016-06-15 09:18:27
回答 1查看 936关注 0票数 3

我被困在一个码头容器中访问一个nfs4共享,运行在弹性豆柄上。

网共享已在运行Docker容器的EC2实例上启动并运行。手动在实例上挂载nfs共享,我可以在没有问题的情况下访问EC2实例上的共享。

但是,当我运行一个容器,试图挂载一个nfs4卷时,文件不会出现在容器中。

我这样做。首先,在Docker主机上启动netshare守护进程:

代码语言:javascript
复制
sudo ./docker-volume-netshare nfs
INFO[0000] == docker-volume-netshare :: Version: 0.18 - Built: 2016-05-27T20:14:07-07:00 == 
INFO[0000] Starting NFS Version 4 :: options: '' 

然后,在Docker主机上,启动码头容器。使用-v创建一个挂载nfs4共享的卷:

代码语言:javascript
复制
sudo docker run --volume-driver=nfs -v ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com/home/ec2-user/nfs-share/templates:/home/ec2-user/xxx -ti aws_beanstalk/current-app /bin/bash
root@0a0c3de8a97e:/usr/src/app#

根据netshare守护进程,这是可行的:

代码语言:javascript
复制
INFO[0353] Mounting NFS volume ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com:/home/ec2-user/nfs-share/templates on /var/lib/docker-volumes/netshare/nfs/ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com/home/ec2-user/nfs-share/templates 

因此,我尝试在新启动的容器中列出/home/ec2-user/xxx的内容--但是它是空的?!

代码语言:javascript
复制
root@0a0c3de8a97e:/usr/src/app# ls /home/ec2-user/xxx/
root@0a0c3de8a97e:/usr/src/app# 

奇怪的是,nfs卷已经正确地安装在主机上:

代码语言:javascript
复制
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo ls -lh /var/lib/docker-volumes/netshare/nfs/ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com/home/ec2-user/nfs-share/templates | head -3
total 924K
drwxr-xr-x 5 ec2-user ec2-user 4,0K 29. Dez 14:12 file1
drwxr-xr-x 4 ec2-user ec2-user 4,0K  9. Mai 17:20 file2

这会不会是许可问题?nfs服务器和客户端都在使用ec2-user用户/组。码头容器以root的形式运行。

我遗漏了什么?

更新

如果以--privileged模式启动容器,则可以将nfs共享直接安装在容器内:

代码语言:javascript
复制
sudo docker run --privileged -it aws_beanstalk/current-app /bin/bash
mount -t nfs4 ec2-xxxx-xxxx-xxxx-xxxx.us-west-2.compute.amazonaws.com:/home/ec2-user/nfs-share/templates /mnt/
ls -lh /mnt | head -3
total 924K
drwxr-xr-x 5 500 500 4.0K Dec 29 14:12 file1
drwxr-xr-x 4 500 500 4.0K May  9 17:20 file2

不幸的是,这并不能解决这个问题,因为ElasticBean秸秆不允许特权容器(与ECS不同)。

更新2

以下是另一个解决办法:

  1. 将主机上的nfs共享安装到/target中。
  2. 重新启动主机上的对接器
  3. 运行容器docker run -it -v /target:/mnt image /bin/bash

/mnt现在已按预期填充。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-11 18:45:12

@sebastian的“更新2”让我走上了正确的轨道(谢谢@sebastian)。

但对于其他可能像我一样通过谷歌解决这个问题的人来说,下面就是我如何能够在ElasticBean秸秆上自动挂载EFS (NFSv4)文件系统并将其提供给容器的方法。

添加此.config文件:

代码语言:javascript
复制
# .ebextensions/01-efs-mount.config
commands:
  01umount:
    command: umount /mnt/efs
    ignoreErrors: true
  02mkdir:
    command: mkdir /mnt/efs
    ignoreErrors: true
  03mount:
    command: mount -t nfs4 -o vers=4.1 $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone).EFS_FILE_SYSTEM_ID.efs.AWS_REGION.amazonaws.com:/ /mnt/efs
  04restart-docker:
    command: service docker stop && service docker start
  05restart-ecs:
    command: docker start ecs-agent

然后是eb deploy。部署完成后,SSH将发送到您的EB EC2实例,并验证它是否有效:

代码语言:javascript
复制
ssh ec2-user@YOUR_INSTANCE_IP
ls -la /mnt/efs

您应该看到EFS文件系统中的文件。但是,您仍然需要验证挂载在容器中是可读的和可写的。

代码语言:javascript
复制
sudo docker run -v /mnt/efs:/nfs debian:jessie ls -la /nfs

您应该看到相同的文件列表。

代码语言:javascript
复制
sudo docker run -v /mnt/efs:/nfs debian:jessie touch /nfs/hello
sudo docker run -v /mnt/efs:/nfs debian:jessie ls -la /nfs

您应该会看到文件列表和新的hello文件。

代码语言:javascript
复制
ls -la /mnt/efs

您还应该看到容器外部的hello文件。

最后,下面是如何在您的-v /mnt/efs:/nfs中使用Dockerrun.aws.json

代码语言:javascript
复制
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "image": "AWS_ID.dkr.ecr.AWS_REGION.amazonaws.com/myimage:latest",
      "memory": 128,
      "mountPoints": [
        {
          "containerPath": "/nfs",
          "sourceVolume": "efs"
        }
      ],
      "name": "myimage"
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/mnt/efs"
      },
      "name": "efs"
    }
  ]
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37831193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档