3

Я застрял в доступе к доле nfs4 в контейнере докера, работающем на эластичном бобовом стебле.Docker nfs4 mount on Elastic Beanstalk

Netshare работает и работает на экземпляре EC2, работающем в контейнере Docker. Установка совместного использования nfs на экземпляр работает, я могу без проблем получить доступ к ресурсу экземпляра EC2.

Однако, когда я запускаю контейнер, пытаясь установить том nfs4, файлы не отображаются внутри контейнера.

Я делаю это. Во-первых, начать NetShare демона на хосте Докер:

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: '' 

Затем на хосте Докер, запустите контейнер Докер. Используйте -v для создания тома для монтажа доли NFS4:

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 
[email protected]:/usr/src/app# 

Это работало, в соответствии с NetShare демона:

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 внутри недавно запущенного контейнера - но его пусто ?!

[email protected]:/usr/src/app# ls /home/ec2-user/xxx/ 
[email protected]:/usr/src/app# 

Как ни странно, объем NFS правильно установлен на хосте:

[[email protected] ~]$ 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.

Что мне не хватает?

UPDATE

Если я запустить контейнер в режиме --privileged, монтаж ООПП разделяют непосредственно внутри контейнера становится возможным:

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 

К сожалению, это не решает проблему, так как Elastic Beanstalk не позволяет использовать привилегированные контейнеры (в отличие от ECS).

UPDATE 2

Вот еще один обходной путь:

  1. смонтировать общий ресурс на хост-компьютере в /target
  2. рестарта грузчиком на хосте
  3. запустить контейнер docker run -it -v /target:/mnt image /bin/bash

/mnt теперь заселен, как ожидалось.

ответ

3

@ «ОБНОВЛЕНИЕ 2» Себастьяна меня посадил на правильном пути (спасибо @sebastian).

Но для других, кто может достичь этого вопроса через Google, как я, именно так я смог автоматически смонтировать файловую систему EFS (NFSv4) на эластичном бобовом стебле и сделать ее доступной для контейнеров.

Добавить .config файл:

# .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 и убедитесь, что он работал:

ssh [email protected]_INSTANCE_IP 
ls -la /mnt/efs 

Вы должны увидеть файлы в EFS файловой системы. Тем не менее, вам все равно нужно проверить, что mount доступен для чтения и записи в контейнерах.

sudo docker run -v /mnt/efs:/nfs debian:jessie ls -la /nfs 

Вы должны увидеть тот же список файлов.

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 файл.

ls -la /mnt/efs 

Вы должны увидеть файл hello снаружи контейнера, а также.

Наконец, вот как вы используете -v /mnt/efs:/nfs в своем Dockerrun.aws.json.

{ 
    "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" 
    } 
    ] 
} 
+0

Спасибо, это отлично поработало для меня. Единственное, что я не понял, это строка в вашем .config: 05restart-ecs: команда: docker start ecs-agent Что такое «ecs-agent» – Neil

+0

От https://github.com/aws/amazon-ecs -agent: «Amazon ECS Container Agent - это программное обеспечение, разработанное для Amazon EC2 Container Service (Amazon ECS). Оно работает на экземплярах контейнеров и запускает контейнеры от имени Amazon ECS». – sebastian

+1

Спасибо markplindsay за добавление деталей, я не потратил время, чтобы записать все. – sebastian