繁体   English   中英

如何将 docker 卷映射到 EC2 主机文件系统

[英]How to map docker volume to EC2 host file system

我们有一堆微服务在共享 AWS EC2 实例的自己的 Docker 容器中运行。 鉴于在本地运行时获得的出色结果,现在我们正在尝试使用 Chronicle 队列作为我们在 AWS 中的微服务之间进行通信的一种方式。

MS1 接收到 API 请求进行一些内部处理并向 CH2 Chronicle 队列发出事件。 MS2 正在侦听 CH2 编年史队列,当事件到达那里时,它会拾取它并进行一些内部处理并将事件发送到 CH3 编年史队列。

API --> MS1 --> CH2 --> MS2 --> CH3 --> ...

在每个容器中,我们有/tmp/my_app_data一个应用程序根文件夹和一个子文件夹,用于微服务与之交互的每个 Chronicle 队列。 例如,在 MS1 容器中,我们有/tmp/my_app_data/ch2 ,在 MS2 容器中,我们有/tmp/my_app_data/ch2/tmp/my_app_data/ch3

所有这些文件夹都以类似的结构映射到 EC2 主机:

/tmp/my_app_data
    |_ch2
    |_ch3
    |_...

现在,在尝试运行我们的系统时,我们遇到了各种访问数据的问题,这些数据是由一个微服务编写的,用于工作流程中的下一个微服务。 在上面的示例中,我们可以进一步让 MS2 从 ch2 读取 MS1 发送给您的数据,但我们仍然无法将数据标记为已处理,这意味着 MS2 正在写入 ch2 文件夹下的文件。

我无法列出我们尝试过的全部排列组合,甚至试图破解容器内和 EC2 主机上的文件权限; 似乎我缺少一些特定于 Docker/AWS 的基本设置。

这是我们来自 MS1 Dockerfile 的 Docker 配置:

 RUN mkdir -p /tmp/my_app_data && chown nobody:nobody /tmp/my_app_data
 RUN mkdir -p /tmp/my_app_data/ch2 && chown nobody:nobody /tmp/my_app_data/ch2
 USER nobody
 VOLUME ["/tmp/my_app_data"]

类似地,我们有来自 MS1 Dockerfile 的相同 Docker 配置:

 RUN mkdir -p /tmp/my_app_data && chown nobody:nobody /tmp/my_app_data
 RUN mkdir -p /tmp/my_app_data/ch2 && chown nobody:nobody /tmp/my_app_data/ch2
 RUN mkdir -p /tmp/my_app_data/ch3 && chown nobody:nobody /tmp/my_app_data/ch3
 USER nobody
 VOLUME ["/tmp/my_app_data"]

在 MS1 和 MS2 任务定义的 AWS 方面,我们有:

    "mountPoints": [
      {
        "readOnly": null,
        "containerPath": "/tmp/my_app_data",
        "sourceVolume": "chronicle"
      }
    ],
    ....
    "volumes": [
      {
        "fsxWindowsFileServerVolumeConfiguration": null,
        "efsVolumeConfiguration": null,
        "name": "chronicle",
        "host": {
          "sourcePath": "/tmp/my_app_data"
         },
        "dockerVolumeConfiguration": null
      }
    ]

所以这是我的问题:我做错了什么,我该如何解决? 理想情况下,对我们来说,这应该在以用户nobody运行时工作,但因为这是一个 POC,我会很感激让它运行,包括root 对我们来说,这个 POC 的目的是确认我们在云中使用 Chronicle 是否获得与在本地运行时相同的良好结果。

预先感谢您的意见。

Chronicle FAQ 中记录了如何设置 Chronicle Queue 以使用 Docker。 您需要确保:

  • 容器共享 IPC 命名空间(使用 --ipc="host" 运行)

  • 队列从主机安装在绑定安装的文件夹上(即 -v /host/dir/1/:/container/dir)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM