名称

podman-cp - 在容器和本地文件系统之间复制文件/文件夹

概要

podman cp [选项] [容器:]源路径 [容器:]目标路径

podman container cp [选项] [容器:]源路径 [容器:]目标路径

描述

podman cp 允许将 源路径 的内容复制到 目标路径。文件可以从容器复制到本地机器,反之亦然,也可以在两个容器之间复制。如果为 - 指定 SRC_PATHDEST_PATH,则还可以从 STDIN 流式传输 tar 归档文件或流式传输到 STDOUT

容器可以处于运行状态或已停止状态,并且 源路径目标路径 可以是文件或目录。

重要事项:podman cp 命令假设容器路径相对于容器的根目录 (/),这意味着提供初始正斜杠是可选的,因此将 compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt 视为相同。

本地机器路径可以是绝对值或相对值。该命令将本地机器的相对路径解释为相对于运行 podman cp 的当前工作目录。

假设路径分隔符为 /,第一个参数为 源路径,第二个参数为 目标路径,则行为如下

源路径 指定一个文件

  • 目标路径 不存在

    • 该文件将保存到在 目标路径 处创建的文件中(请注意,父目录必须存在)。

  • 目标路径 存在并且是一个文件

    • 目标将被源文件的内容覆盖。

  • 目标路径 存在并且是一个目录

    • 该文件将使用 源路径 中的基名称复制到该目录中。

源路径 指定一个目录

  • 目标路径 不存在

    • 目标路径 将被创建为一个目录,并且源目录的内容将被复制到该目录中。

  • 目标路径 存在并且是一个文件

    • 错误条件:无法将目录复制到文件。

  • 目标路径 存在并且是一个目录

    • 源路径/ 结尾

      • 源目录将被复制到该目录中。

    • 源路径/. 结尾(即斜杠后跟点)

      • 源目录的内容将被复制到该目录中。

该命令要求根据上述规则存在 源路径目标路径

如果 源路径 是本地的并且是一个符号链接,则默认情况下将复制符号目标。

冒号 ( : ) 用于作为容器及其路径之间的分隔符,它也可以用于指定本地机器上的 源路径目标路径 的路径,例如 file:name.txt

重要事项:在本地机器路径中使用 冒号 ( : ) 时,必须明确使用相对路径或绝对路径,例如:/path/to/file:name.txt./file:name.txt

- 作为 源路径STDIN 的内容作为 tar 归档文件流式传输。该命令将 tar 的内容提取到容器中的 DEST_PATH。在这种情况下,目标路径 必须指定一个目录。将 - 作为 目标路径 将资源(可以是目录)的内容作为 tar 归档文件流式传输到 STDOUT

请注意,podman cp 在从运行的无根容器复制时会忽略权限错误。无根容器中的 TTY 设备归属于主机的 root 用户,因此无法在容器的用户命名空间中读取它们。

进一步注意,podman cp 不支持通配符(例如,cp dir/*.txt)。要将多个文件从主机复制到容器,请将 xargs(1) 或 find(1)(或用于链接命令的类似工具)与 podman cp 结合使用。要将多个文件从容器复制到主机,请使用 podman mount CONTAINER 并改为对返回的挂载点进行操作(请参见下面的替代方法)。

选项

--archive, -a

归档模式(复制所有 UID/GID 信息)。当设置为 true 时,复制到容器的文件会将所有权更改为容器的主要 UID/GID。当设置为 false 时,保留来自归档源的 UID/GID,而不是将它们更改为目标容器的主要 UID/GID。默认值为 true

--overwrite

允许用非目录覆盖目录,反之亦然。默认情况下,podman cp 在尝试覆盖时会出错,例如用目录覆盖普通文件。

替代方法

Podman 的功能远不止 podman cp,可以实现主机和容器之间的文件复制。

使用标准 podman-mount(1)podman-unmount(1) 利用了整个 linux 工具链,而不仅仅是 cp。

从容器复制内容到容器,可以通过几个简单的命令来实现。例如

要将 /etc/foobar 目录从容器复制到主机的 /tmp 上,可以执行以下命令

mnt=$(podman mount CONTAINERID)
cp -R ${mnt}/etc/foobar /tmp
podman umount CONTAINERID

要将 tar 包解压缩到容器中,可以执行以下命令

mnt=$(podman mount CONTAINERID)
tar xf content.tgz -C ${mnt}
podman umount CONTAINERID

要在没有安装 dnf 的容器中安装软件包,可以执行以下命令

mnt=$(podman mount CONTAINERID)
dnf install --installroot=${mnt} httpd
chroot ${mnt} rm -rf /var/log/dnf /var/cache/dnf
podman umount CONTAINERID

通过使用 podman mountpodman unmount,可以使用所有标准 linux 工具将文件移入和移出容器,而不仅仅是 cp 命令。

示例

将文件从主机复制到容器

podman cp /myapp/app.conf containerID:/myapp/app.conf

将文件从容器复制到另一个容器上的目录

podman cp containerID1:/myfile.txt containerID2:/tmp

将容器上的目录复制到主机上的目录

podman cp containerID:/myapp/ /myapp/

将容器上目录的内容复制到主机上的目录

podman cp containerID:/home/myuser/. /home/myuser/

将容器上的目录复制到另一个容器上的目录

podman cp containerA:/myapp containerB:/newapp

将 tar 归档文件从 STDIN 流式传输到容器

podman cp - containerID:/myfiles.tar.gz < myfiles.tar.gz

另请参见

podman(1), podman-mount(1), podman-unmount(1)