Крепление Docker nfs4 на Elastic Beanstalk

Я застрял при доступе к общему ресурсу nfs4 внутри док-контейнера, работающего на Elastic Beanstalk.

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

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

Я сделаю это. Сначала запустите демон netshare на хосте Docker:

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 запустите контейнер Docker. Используйте -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
root@0a0c3de8a97e:/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 внутри только что запущенного контейнера, но он пуст?!

root@0a0c3de8a97e:/usr/src/app# ls /home/ec2-user/xxx/
root@0a0c3de8a97e:/usr/src/app# 

Как ни странно, том nfs правильно смонтировался на хосте:

[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 непосредственно внутри контейнера:

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).

ОБНОВЛЕНИЕ 2

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

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

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


person sebastian    schedule 15.06.2016    source источник


Ответы (1)


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

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

Добавьте этот .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. После завершения развертывания подключитесь к инстансу EB EC2 по SSH и убедитесь, что он работает:

ssh ec2-user@YOUR_INSTANCE_IP
ls -la /mnt/efs

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

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"
    }
  ]
}
person markplindsay    schedule 11.09.2016
comment
Спасибо, это отлично сработало для меня. Единственное, чего я не понял, так это строки в вашем .config: 05restart-ecs: command: docker start ecs-agent Что такое ecs-agent - person Neil; 25.11.2016
comment
Из github.com/aws/amazon-ecs-agent: агент контейнера Amazon ECS — это программное обеспечение, разработанное для службы контейнеров Amazon EC2 (Amazon ECS). Он работает на инстансах контейнеров и запускает контейнеры от имени Amazon ECS. - person sebastian; 25.11.2016
comment
Спасибо, markplindsay, за добавление деталей, у меня не было времени все записывать. - person sebastian; 25.11.2016