将 docker 个容器中的信息保存到本地

Save information from docker container to local

我正在尝试将在 docker 图像 (docker_test.csv) 中创建的文件保存到我的本地计算机。

我有一张看起来像这样的图片

FROM python:3.9-alpine3.13
    
RUN echo hello >> 'docker_test.csv'

我使用这条线创建图像

docker build --tag dockerfile .

我尝试 运行 使用

docker run -v $(pwd): -p 8080:8080 -it dockerfile

但是我得到以下错误

docker: Error response from daemon: invalid volume specification: '/host_mnt/Users/username/documents :'

我不确定从这里去哪里,我尝试了不同的路径配置,但一切似乎都会导致错误。

您缺少另一半的卷安装。

冒号前的部分是宿主系统的路径,冒号后的部分是容器内部的路径。嗯,冒号后面没有了。

-v $(pwd): 

它应该看起来像这样。

-v $(pwd):/path/in/container 

不过,这会用卷内的数据覆盖该路径上的容器内的数据,在这种情况下,来自主机系统的文件。

据我所知,您可以指定一个卷,使其在第一次挂载时从容器写入卷,而不是用卷内的数据覆盖容器的文件系统,这是默认行为。这在此处记录 https://docs.docker.com/storage/volumes/#populate-a-volume-using-a-container

docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest

不过,该示例使用的是命名卷。要在主机系统上的任意位置执行此操作很棘手。

在 compose 中,这种类型的卷看起来像这样。

volumes:
  myvolume:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./myvolume

要做到这一点,使用 CLI 非常麻烦。我不完全确定这会是什么样子。

也许,像下面这样。您需要对此进行试验并仔细研究链接的文档。

--mount 'source=myvolume,destination=/path/in/container,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=./myvolume'

也就是说,将空卷挂载到容器内的空路径并在挂载后创建文件会更容易,这会导致文件出现在主机系统上。

为此,请使用 CMD 而不是 运行 指令。

FROM python:3.9-alpine3.13
CMD echo hello >> '/output/docker_test.csv'

然后构建映像并 运行 它,以标准方式安装卷。

mkdir output
docker run -v "$PWD/output:/output" myimage