title: Docker命令解读(四)
date: 2015-11-23 10:04:19
tags: docker
categories: Docker Commands
Docker命令解读系列文章将系统讲解Docker使用的命令,方便大家学习Docker的基本操作。在写这个系列文章的时候,主要参考了Docker官方的文档,有些内容是直接的翻译。原文档地址 Docker Docs
转载请注明出处
本篇的命令大都与文件相关。
目录:
* cp
* diff
cp
Usage: docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
Copy files/folders between a container and the local filesystem
Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.
--help=false Print usage
Usage
的第一行是将容器中的文件或目录拷贝到宿主机上;第二行是将宿主机上的文件或目录拷贝到容器中的某个文件夹中。
对正在运行的或已经停止的容器都可以执行cp
命令,PATH
可以是一个目录,也可以是文件。Docker
默认container:PATH
指向的文件或文件夹是相对于/
根目录的,也就是说,PATH
最前面的/
是可选的。
如果LOCALPATH
是相对地址,则它是相对于当前工作目录的。
关于拷贝的文件的权限,分两种情况:
- 从宿主机拷贝到容器:拷贝后文件的UID
,GID
都是root
用户对应的ID。
- 从容器拷贝到宿主机:拷贝后文件的UID
,和GID
都是执行cp
命令的用户的相应ID。
下面用SRC_PATH
表示源文件的位置,DST_PATH
表示要拷贝到的位置,拷贝的结果有如下几种情况:
- SRC_PATH
指向一个文件:
- DST_PATH
指向的地址不存在:在DST_PATH
指向的位置创建文件并保存;
- DST_PATH
指向的地址不存在且以/
结尾:报错,指定的目的文件夹必须存在;
- DST_PATH
存在且是一个文件:DST_PATH
指向的文件被SRC_PATH
指向的文件的内容覆盖;
- DST_PATH
存在且指向一个目录:文件被拷贝到目的文件夹中,且文件名不变。
- SRC_PATH
指向一个目录:
- DST_PATH
不存在:在DST_PATH
位置创建文件夹并将SRC_PATH
文件夹下的所有文件拷贝到创建的文件夹下;
- DST_PATH
存在但是一个文件:报错,不能将文件夹拷贝为文件;
- DST_PATH
存在且是一个文件夹:分两种情况:
- SRC_PATH
没有以/.
结尾:将SRC_PATH
文件夹拷贝到DST_PATH
文件夹下;
- SRC_PATH
以/.
结尾:将SRC_PATH
下的所有内容拷贝到DST_PATH
文件夹下;
如果SRC_PATH
指向一个符号链接,则拷贝的是符号链接而不是链接指向的文件。
一些系统文件如/proc
,/sys
,dev
和容器中用户挂在的文件是不能拷贝的。
有一个特殊的符号-
,用途比较特殊:
当-
作为第一个参数替代LOCALPATH
时(上面Usage的第二行),会将一个打包后的文件写入STDIN
并将其解压到容器中的目的文件夹内,此时PATH
参数必须是一个文件夹。
当-
作为第二个参数替代LOCALPATH
时(Usage的第二行),会将容器中的内容打包成tar并通过STDOUT
输出。
diff
Usage: docker diff [OPTIONS] CONTAINER
Inspect changes on a container's filesystem
--help=false Print usage
列出容器中文件系统的变化,关于文件的三种操作会被列出:
- A
- ADD 添加的文件
- D
- Delete 删除的文件
- C
- Change 改变的文件
示例:
$ docker diff 7bb0e258aefe
C /dev
A /dev/kmsg
C /etc
A /etc/mtab
A /go
A /go/src
A /go/src/github.com
A /go/src/github.com/docker
A /go/src/github.com/docker/docker
A /go/src/github.com/docker/docker/.git