Локально смонтировать AWS EFS с помощью docker-compose

Мне интересно, есть ли простой способ использовать Amazon EFS (эластичная файловая система) для монтирования в качестве тома в локальной настройке docker-compose.

Причина в том, что для локальной разработки созданные тома сохраняются на моем ноутбуке - если бы я сменил машину, я не смог бы получить доступ ни к каким из этих базовых данных. Облачная NFS решила бы эту проблему, поскольку она была бы легко доступна из любого места.

Документация AWS (https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html), кажется, предлагает использовать AWS Direct Connect / VPN - есть ли способ избежать этого, открыв порт 2049 (трафик NFS) в группе безопасности, которая прослушивает все IP-адреса и применяет эту группу безопасности к вновь созданной EFS?

Вот мой docker-compose.yml:

version: "3.2"
 
services:
  postgres_db:
    container_name: "postgres"
    image: "postgres:13"
    ports:
      - 5432:5432
    volumes:
      - type: volume
        source: postgres_data
        target: /var/lib/postgresql/data
        volume:
          nocopy: true
    environment: 
      POSTGRES_USER: 'admin'
      POSTGRES_PASSWORD: "password"
 
volumes: 
  postgres_data:
    driver_opts:
      type: "nfs"
      o: "addr=xxx.xx.xx.xx,nolock,soft,rw"
      device: ":/docker/example"

Я получаю следующую ошибку:

ERROR: for postgres_db  Cannot start service postgres_db: error while mounting volume '/var/lib/docker/volumes/flowstate_example/_data': failed to mount local volume: mount :/docker/example:/var/lib/docker/volumes/flowstate_example/_data, data: addr=xxx.xx.xx.xx,nolock,soft: connection refused

Я интерпретирую это как то, что подключение моего ноутбука не является частью AWS EFS VPC, поэтому он не может смонтировать EFS.

Для дополнительного контекста я хочу закрепить настройку парсинга веб-страниц и сохранить объем данных в облаке, чтобы я мог подключаться к нему из любого места.


person yongsheng    schedule 27.09.2020    source источник
comment
есть ли решение, которое сработало? мы сталкиваемся с аналогичной ситуацией, и ответ ниже не работает   -  person toing    schedule 07.07.2021


Ответы (1)


EFS предполагает nfs4, поэтому:

version: '3.8'

services:

  postgres:
    volumes:
      postgres_data:/var/lib/postgresql/data

volumes: 

  postgres_data:
    driver_opts:
      type: "nfs4"
      o: "addr=xxx.xx.xx.xx,nolock,soft,rw"
      device: ":/docker/postgres_data"

Конечно, должен существовать указанный nfs-export / path. Swarm не будет автоматически создавать несуществующие папки.

Обязательно удалите все старые тома докеров этого неисправного типа / имени вручную (на всех узлах роя!) Перед воссозданием стека:

docker volume rm $(docker volume ls -f name=postgres_data -q)

Это важно понимать: объемы Docker NFS на самом деле являются только декларацией, где искать данные. Он не обновляется, когда вы обновляете свой docker-compose.yml, поэтому вы должны удалить том, чтобы появилась любая новая конфигурация.

см. вывод

docker service ps stack_postgres --no-trunc

для получения дополнительной информации, почему объем не может быть установлен

Также убедитесь, что вы можете смонтировать nfs-export через mount -t nfs4 ...

см. showmount -e your.efs.ip.address

person sgohl    schedule 18.01.2021
comment
это не работает для меня. не могли бы вы предоставить / предоставить больше вашего файла для создания докеров? - person toing; 07.07.2021