【问题标题】:Create/Touch a file on host from docker container从 docker 容器创建/触摸主机上的文件
【发布时间】:2020-07-17 04:44:10
【问题描述】:

我想把一些配置文件压缩成一个tar并保存在主机的/root/路径中。

目前我在容器内运行的代码正在容器内创建 tar,然后将其复制到服务器。

有没有办法可以从容器内部直接在主机上创建 tar。一个带有触摸命令的简单示例在这里也会有所帮助。

【问题讨论】:

  • 使用volumes?
  • 如果您的进程的主要目标是在主机上创建文件,那么不在 Docker 中运行它可能会容易得多(作为设计目标使这变得困难)。

标签: linux docker shell docker-compose filesystems


【解决方案1】:

是的,你可以将主机目录堆起来,然后运行所需的命令,

下面将创建 tar 文件并退出。从所需目录运行以下命令。

.
└── config
    └── default.conf

创建 tar

docker run -it --rm --workdir=/app -v $PWD/:/app alpine sh -c "tar -czvf file.tar.gz config"

执行后的树

├── config
│   └── default.conf
└── file.tar.gz

从容器到主机

docker run -it --rm --workdir=/app -v $PWD/:/app alpine sh -c "mkdir myfiles; cd myfiles; touch hello.txt; cd ..; tar -czvf file.tar.gz myfiles"
  • 它创建 myfiles/hello.txt 或者它也可以是现有目录
  • 在主机装载位置创建 tar

对于容器中的现有目录

docker run -it --rm --workdir=/app -v $PWD/:/app alpine sh -c "cd parent_directory; tar -czvf file.tar.gz myfiles; cp parent_directory/file.tar.gz /app"

将 tar 文件写入主机

 docker run -it --rm  alpine sh -c "cd path_to_tar ; tar -czf - ." >filename.tar.gz

【讨论】:

  • 文件夹配置(我要压缩)不在主机服务器上,它在 docker 容器内。在您的解决方案中,配置应该在主机上吧?
  • 是的,它假设在主机中,你想在容器内部压缩,然后把它带到主机上?
  • 更新了@Rishav,您可以检查从容器到主机的部分
  • 谢谢!但正如我所提到的,这是我目前的逻辑。去皮重和复制需要时间(x+y 时间单位)。我想将容器内的文件tar直接写入主机上的tar文件。
  • @Rishav 明白了。答案已更新。您现在可以直接写信给主机
【解决方案2】:

您需要mount a volume。在这种情况下,在您的docker-compose.yml 中,使用主机上的绝对路径和容器中的相应路径指定卷,例如:

version: "3"
services:
  my-service:
    build:
      context: ../
      dockerfile: Dockerfile
    image: my-service
    volumes:
      - "/root/:/path/to/container/dist/"

然后,在您的容器中,只需将文件写入/path/to/container/dist/ 目录,方法如下:

$ cp my_config.tar /path/to/container/dist/

请注意,此输出路径可以在任何地方并具有任何名称。确保它是特定于主机和容器之间的“隧道”的目录,否则最终可能会写入不需要的文件,或者您可能会覆盖主机 /root/ 中存在的其他文件。

【讨论】:

  • 我可以使用 shell 脚本吗?我可以在不添加 docker-compose 文件的情况下挂载卷吗?
  • 是的,您可以,但您仍将使用 docker-cli API(包装在 shell 脚本中)。
  • 如果您需要进一步的帮助,请编辑您的原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多