我可以在Docker容器之间共享文件,如何与主机共享相同的文件

我可以在Docker容器之间共享文件,如何与主机共享相同的文件,docker,volumes,Docker,Volumes,我有许多运行Pi4的容器,这些容器由docker-compose.yml文件定义(摘录如下)。它们从一块硬件收集数据,该硬件将数据记录到“硬件”容器上的/home/hardware/data/。通过名为卷的“数据”与“芹菜工作者”容器成功共享 我的问题是,我还需要将文件共享到主机上(例如/tmp/hardware_data),因为它们需要由我家庭网络上另一台机器上的另一个应用程序读取 /tmp/hardware\u data:/home/hardware/data/不工作 我在谷歌上搜索过,

我有许多运行Pi4的容器,这些容器由docker-compose.yml文件定义(摘录如下)。它们从一块硬件收集数据,该硬件将数据记录到“硬件”容器上的/home/hardware/data/。通过名为卷的“数据”与“芹菜工作者”容器成功共享

我的问题是,我还需要将文件共享到主机上(例如/tmp/hardware_data),因为它们需要由我家庭网络上另一台机器上的另一个应用程序读取

  • /tmp/hardware\u data:/home/hardware/data/不工作
我在谷歌上搜索过,阅读过Docker文档,观看过很多youtube视频,但还没有找到解决方案

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - data:/home/hardware/data/

volumes:
  #to share hardware data
  data: {}
XXXXXXXXXXXXXX 更新

Konrad关于删除命名卷的建议很有意义,我的(摘录)docker-compose.yml文件现在看起来如下所示:

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/
celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/
在开发过程中,我以root用户身份运行Docker。我已经“接触”了硬件容器Dockerfile中的“测试文件”。如果我运行带有卷#'d的容器,则“测试文件”将在硬件容器的/home/hardware/data/中创建,并具有以下权限“-r w-r--r--root”

当我使用定义的卷运行docker-compose.yml时,我得到三个空目录(2个在容器中,1个在主机中),即硬件容器的“测试文件”不存在于任何目录中。如果我在任何目录中“触摸”一个“新测试文件”,它将以与原始目录相同的权限在所有三个目录中共享“测试文件”:“-rw-r--r--root”


基于此,我看不出这是权限问题

您需要删除命名卷并使用主机上的文件夹,如下所示:

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/
celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/
编辑:

如果没有硬件服务中运行的应用程序的任何详细信息,我能想到的唯一原因是它不会将数据写入绑定的主机目录是权限问题

这是一篇关于这个主题的文章。

解决方案

我从这里得到了一些线索: Meyay的回答是“只有在命名卷的情况下,现有数据才会从容器目标文件夹复制到卷中。”

此代码有效。请注意:/tmp/data必须预先存在于主机上,具有与docker容器相同的权限(我认为是所有者)

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - data:/home/hardware/data/

volumes:
  data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /tmp/data

我想这是因为您有一个docker卷和一个本地卷绑定到容器上的同一路径。不是100%确定,但这似乎最有可能发生错误,您能告诉我,
mount/tmp/hardware\u data-on/home/hardware/data/
mount/home/hardware/data/on/tmp/hardw之间有什么区别吗_data
?在我看来,它们是一样的。谢谢你们。也许我只是混淆了情况。命名的卷工作正常。忽略我如何解决它,因为它不工作。我如何与我的主机共享docker hardware容器中/home/hardware/data/中生成的文件?我已经修改了我的问题我理解你的设置是,它们应该开始为空,然后硬件服务将用数据填充它们。很抱歉,我需要删除我以前的内容,因为它包含一些机密信息。再次是…………非常感谢。这很有意义,听起来很有希望,但在尝试时……所有三个目录都是空的。我认为nk您的答案是正确的,但这里的问题不是我正在将一个空的主机目录/tmp/hardware\u data装载到/home/hardware/data/容器中,使其看起来是空的吗?“我理解您的设置的方式是,它们应该开始为空,然后硬件服务将用数据填充它们。”……没错,Konrad所有三个目录都开始为空,硬件填充硬件容器中的/home/hardware/data目录。如果我将文件放入主机目录,则它会出现在容器中。我需要它以相反的方式出现。放入容器的数据需要与另一个容器和主机。因此,我的解决方案的问题是硬件服务没有填充目录?是否有某种类型的日志可用?可能对
/tmp/hardware_data
目录的权限不正确?感谢Konrad。1)硬件服务填充硬件目录,但没有定义卷。2)它填充并共享数据(与其他容器一起)使用命名卷,但3)定义主机:容器卷后,所有目录都为空。