【问题标题】:How To Access Docker Container Files From Vscode?如何从 Vscode 访问 Docker 容器文件?
【发布时间】:2020-11-15 13:30:36
【问题描述】:

我正在关注这个https://towardsdatascience.com/creating-your-own-object-detector-ad69dda69c85 来试验 Tensorflow 对象检测。本教程不使用 docker,但我也在尝试学习它,所以我使用的是 docker。

现在我有一个问题。目前,每当我对需要运行的任何内容进行更新时

docker build -f research/object_detection/dockerfiles/tf2/Dockerfile -t od .

在我的 docker 容器识别出任何更改之前。例如,如果我添加一个文件夹并在再次运行 docker build 之前尝试访问它,我将收到一个找不到文件的错误。同样处理任何代码文件。我更新的任何 python 脚本都必须保存,然后我必须再次运行 docker build。

此外,我正在使用的脚本之一创建了一个新文件,该文件似乎只有在我有相同的 cmd 时才能访问,我在其中输入了命令来创建打开的文件。如果我关闭该 cmd 并运行 (docker run -it od) 以打开另一个容器,则该文件将无法再访问。

我怎样才能直接访问 docker 容器/图像中的文件(不管是什么,此时我都头疼,不知道发生了什么)

我查看了 vscode 的远程容器扩展,但不确定如何访问 docker build 命令创建的任何内容。

任何帮助将不胜感激。 TIA

编辑: 我在 Users/zkj/models 中运行命令 docker run -it od(也从这里运行构建)

我的目标是将 Users/zkj/models/research/object_detection 中的任何更改注册到 docker。

【问题讨论】:

  • 我通常通过在 Docker 之外进行日常开发来管理这一点,并且仅在需要进行集成测试或部署时构建和运行 Docker 映像。
  • 那是我希望做的,但是我安装 Tensorflow 的方式使它只存在于 Docker 环境中:/ 我可以将它安装在我的系统中,但从他们的文档中它应该将安装保存在 venv 中是一个很好的做法。
  • @ZKJ 听起来你想要一个虚拟环境。这是a good tutorial

标签: python docker tensorflow containers


【解决方案1】:

最简单的方法是在使用-v <your-local-folder>:/home 构建时将包含源文件的文件夹公开给 docker 容器。这样,在您的容器操作期间创建的任何文件也可以在您的本地文件夹中访问。

【讨论】:

    【解决方案2】:

    总的来说,有四种方法可以实现这一点。我将首先描述最简单的解决方案,最后描述最复杂的解决方案。

    1. 将源文件绑定挂载到容器中。绑定挂载允许您创建一个在容器和主机上都可以访问的目录。这是一个例子。假设您有目录/home/zkj/tensorflow。您希望它在 docker 容器中作为/code 可用。您可以使用以下选项来docker run

      docker run -v /home/zkj/tensorflow:/code ...
      

      绑定挂载的优点是对绑定挂载中的文件之一的更改会立即反映在容器中。 (注意:您可能需要再次运行docker run 才能重新运行程序。)

      (Documentation.)

    2. 使用docker cp 将文件复制出容器。您必须知道容器的名称。这和图片的名字不一样!使用docker ps 查找容器的名称。

      (Documentation.)

    3. 重新安排 RUN 步骤,以便首先执行昂贵的步骤,最后复制源代码。 从技术上讲,这不是您要求的,而是通过重新安排层在您的 docker 映像中,您可以利用缓存,并使构建速度提高 10-100 倍,这使 docker build 的痛苦大大减轻。

      这是一个例子。假设我有以下 Dockerfile,它会复制我的源代码并安装依赖项:

      COPY code /
      RUN pip install -r /code/requirements.txt
      

      问题在于它没有利用构建缓存。如果您对代码进行任何更改,这将使第一步的缓存无效,这反过来意味着后面的步骤也将无效。但是如果你先安装依赖,那么当你的依赖发生变化时,你只需要重新构建那一步:

      COPY code/requirements.txt /
      RUN pip install -r /requirements.txt
      COPY code /
      

      在这个版本中,前两步可以缓存,第三步非常快。

    4. 使用docker exec 获取容器内的外壳。 使用docker ps 获取容器的名称。然后,运行:

      docker exec -it <container name> /bin/bash
      

      docker rundocker exec 有什么区别? docker run 创建一个 new 容器。 docker exec现有 容器中运行命令。

    【讨论】:

    • 对于您的第一个解决方案,我需要输入的确切内容是什么?为了打开我一直在运行的容器: docker run -it od.我尝试在一个不起作用的开放容器中运行 docker -v 。阅读文档后,似乎我需要做:docker run -it od -v filePath:/accessPoint,但是当我这样做时,我仍然会出错。我在帖子底部添加了我的文件路径,请看一下:)
    • 还有这些命令去哪里了? docker CLI 还是终端?
    • docker 的选项必须放在镜像名称之前。使用docker run -it -v filePath:/accessPoint od
    • Also where do these commands go? the docker CLI or terminal? 我不明白。两者有什么区别?
    • @ZKJ Do I access the point using cd accessPoint from inside the container? 是的。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2020-08-24
    • 2017-12-29
    • 2017-02-25
    • 2020-11-20
    • 2018-04-14
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多