Я застрял при доступе к общему ресурсу 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
Вот еще один обходной путь:
- смонтировать общий ресурс nfs на хосте в
/target
- перезапустить докер на хосте
- запустить контейнер
docker run -it -v /target:/mnt image /bin/bash
/mnt
теперь заполнен, как и ожидалось.