名称¶
podman-cp - 在容器和本地文件系统之间复制文件/文件夹
概要¶
podman cp [选项] [容器:]源路径 [容器:]目标路径
podman container cp [选项] [容器:]源路径 [容器:]目标路径
描述¶
podman cp 允许将 源路径 的内容复制到 目标路径。文件可以从容器复制到本地机器,反之亦然,也可以在两个容器之间复制。如果为 -
指定 SRC_PATH
或 DEST_PATH
,则还可以从 STDIN
流式传输 tar 归档文件或流式传输到 STDOUT
。
容器可以处于运行状态或已停止状态,并且 源路径 或 目标路径 可以是文件或目录。
重要事项:podman cp 命令假设容器路径相对于容器的根目录 (/
),这意味着提供初始正斜杠是可选的,因此将 compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_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 mount
和 podman 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