名称

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

简介

podman cp [选项] [容器:]src_path [容器:]dest_path

podman container cp [选项] [容器:]src_path [容器:]dest_path

描述

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

容器可以是运行状态或停止状态,src_pathdest_path 可以是文件或目录。

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

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

假设路径分隔符为 /,第一个参数为 src_path,第二个参数为 dest_path,行为如下:

src_path 指定文件

  • dest_path 不存在

    • 文件保存到在 dest_path 创建的文件中(请注意,父目录必须存在)。

  • dest_path 存在且为文件

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

  • dest_path 存在且为目录

    • 文件复制到此目录中,使用 src_path 的基本名称。

src_path 指定目录

  • dest_path 不存在

    • dest_path 创建为目录,源目录的内容复制到此目录中。

  • dest_path 存在且为文件

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

  • dest_path 存在且为目录

    • src_path/ 结尾

      • 源目录复制到此目录中。

    • src_path/. 结尾(即斜杠后跟点)

      • 源目录的内容复制到此目录中。

该命令要求 src_pathdest_path 按照上述规则存在。

如果 src_path 是本地且是符号链接,则默认复制符号目标。

冒号 ( : ) 用作容器与其路径之间的分隔符,也可以在指定本地机器上的 src_pathdest_path 时使用,例如 file:name.txt

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

使用 - 作为 src_pathSTDIN 的内容作为 tar 归档文件流式传输。该命令将 tar 的内容解压到容器中的 DEST_PATH。在这种情况下,dest_path 必须指定一个目录。使用 - 作为 dest_path 将资源(可以是目录)的内容作为 tar 归档文件流式传输到 STDOUT

请注意,从正在运行的无根容器复制时,podman cp 会忽略权限错误。无根容器内的 TTY 设备由主机的 root 用户拥有,因此无法在容器的用户命名空间内读取。

另请注意,podman cp 不支持通配符(例如,cp dir/*.txt)。要将多个文件从主机复制到容器,请结合 podman cp 使用 xargs(1) 或 find(1)(或类似的命令链工具)。要将多个文件从容器复制到主机,请使用 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)