【问题标题】:How to exchange files between docker container and local filesystem?如何在 docker 容器和本地文件系统之间交换文件?
【发布时间】:2020-07-08 07:58:27
【问题描述】:

我有一个 TypeScript 代码,它读取目录的内容,并且必须每隔一段时间一一删除它们。
在本地一切正常。我为我的代码制作了一个 docker 容器并希望达到相同的目的,但是,我意识到目录内容与构建容器时存在的相同。
至于我的理解,docker容器和本地文件系统之间的连接是缺失的。
我一直在bindvolume 选项附近徘徊,我偶然发现了以下简单教程:

How To Share Data Between the Docker Container and the Host

根据之前的教程,理论上我应该可以达到我的目的:

如果您对 ~/nginxlogs 文件夹进行任何更改,您也可以从 Docker 容器中实时查看它们。

但是,我遵循完全相同的步骤,但仍然看不到本地所做的更改反映在 docker 容器中,反之亦然。
我的问题是:如何从 docker 容器访问我的本地文件系统以读取/写入/删除文件?

更新
这是我的dockerfile

FROM ampervue/ffmpeg
RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
RUN apt-get update -qq && apt-get install -y --force-yes \
    nodejs; \
    apt-get clean
RUN npm install -g fluent-ffmpeg
RUN rm -rf /usr/local/src
RUN apt-get autoremove -y; apt-get clean -y
WORKDIR /work
COPY package.json .
COPY . .

CMD ["node", "sizeCalculator.js"]

【问题讨论】:

  • 使用卷挂载可以在容器和主机文件系统之间共享文件
  • 如果您可以分享您的dockerfiledocker-compose,那么我可以帮助您创建卷挂载:P
  • 你要找的都是可能的,分享一下dockerfile
  • 好的,菲利普斯,你已经接近了。您上面缺少的绝对是一个标志(也许-v?)。在您docker run ... 之后,您可以使用docker inspect ... 并检查“安装”部分,如果您的SourceDestination 设置正确。 (我还删除了一些 cmets 以保持页面整洁)。
  • 感谢 Tgogos 的帮助。实际上@DupinderSingh 的回答对我有用并澄清了这个问题。我的标志和目录有问题。

标签: docker filesystems


【解决方案1】:

下面的例子直接来自docs

下面的--mount-v 示例产生相同的结果。除非在运行第一个容器后删除 devtest 容器,否则不能同时运行它们。

  • -v:

    docker run -d -it --name devtest -v "$(pwd)"/target:/app nginx:latest
    
  • --mount:

    docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest
    

您必须在此处输入 2 个不同的路径:

-v /path/from/your/host:/path/inside/the/container
   <-------host------->:<--------container------->

--mount type=bind,source=/path/from/your/host,target=/path/inside/the/container
                         <-------host------->        <--------container------->

【讨论】:

    【解决方案2】:

    在 docker run 命令上进行卷挂载的简单方法

    docker run -it -v /&lt;Source Dir&gt;/:/&lt;Destination Dir&gt; &lt;container_name&gt; bash

    另一种方法是使用docker-compose。 让我们用 docker-compose 试试吧

    将您的 dockerfile 和 docker-compose 放在同一位置或目录

    主要焦点

    volumes:
      - E:\dirToMap:/work
    

    docker-compose.yaml

    version: "3"
    services:
      ampervue:
        build:
          context: ./
        image: <Image Name>
        container_name: ampervueservice
        volumes:
          - E:\dirToMap:/vol1
        ports:
          - 8080:8080
    

    并在 dockerfile 中添加卷

    FROM ampervue/ffmpeg
    RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
    RUN apt-get update -qq && apt-get install -y --force-yes \
        nodejs; \
        apt-get clean
    RUN npm install -g fluent-ffmpeg
    RUN rm -rf /usr/local/src
    RUN apt-get autoremove -y; apt-get clean -y
    WORKDIR /work
    VOLUME /vol1
    COPY package.json .
    COPY . .
    
    CMD ["node", "sizeCalculator.js"]
    

    并运行以下命令来启动容器

    docker-compose -f "docker-compose-sr.yml" up -d --build
    

    【讨论】:

    • 谢谢一百万!您的回答向我阐明了许多观点。目前我只是尝试了你提到的第一种方法(简单的方法),它对我来说达到了目的。接下来我将尝试使用其他方式确认(通过使用docker-compse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2014-01-15
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多