名称¶
podman-cp - 在容器与本地文件系统之间复制文件/文件夹
简介¶
podman cp [选项] [容器:]src_path [容器:]dest_path
podman container cp [选项] [容器:]src_path [容器:]dest_path
描述¶
podman cp 允许将 src_path 的内容复制到 dest_path。文件可以从容器复制到本地机器,反之亦然,或在两个容器之间复制。如果 SRC_PATH 或 DEST_PATH 指定为 -
,则也可以将 tar 归档文件从 STDIN
流式传输或流式传输到 STDOUT
。
容器可以是运行状态或停止状态,src_path 或 dest_path 可以是文件或目录。
重要提示:podman cp 命令假定容器路径相对于容器的根目录 (/
),这意味着提供开头的斜杠是可选的,因此将 compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_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_path 和 dest_path 按照上述规则存在。
如果 src_path 是本地且是符号链接,则默认复制符号目标。
冒号 ( : ) 用作容器与其路径之间的分隔符,也可以在指定本地机器上的 src_path 或 dest_path 时使用,例如 file:name.txt
。
重要提示:在本地机器路径中使用冒号 ( : ) 时,必须明确指定相对或绝对路径,例如:/path/to/file:name.txt
或 ./file:name.txt
使用 -
作为 src_path 将 STDIN
的内容作为 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 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