我希望能够将白名单文件夹从文件系统复制到目标容器中。
基本上,我想执行一个“复杂”的操作cp -r app vendor target
,其中target
是一个Docker容器。
我有一个简单的Docker文件:
FROM alpine
COPY app/* /www/
COPY vendor /www/
由于原因未知,第一个命令并没有复制
app
目录本身。看起来Docker不能区分app
和app/之间的区别,这非常恼人。
为了测试目的,我创建了以下结构:
.
├── app
│ ├── foo
│ └── second
│ └── barf
├── Dockerfile
└── vendor
└── bar
docker build -t test . && docker run -it test ash
:
执行结果?目录结构未得到保留,父级目录未被复制。
/www/
├── bar
├── barf
└── foo
docker info
:
Server Version: 1.12.1
Storage Driver: overlay2
Backing Filesystem: extfs
请问为什么Docker的COPY . /target
和COPY app/* /target
会有不同的行为?这是出于什么动机呢?为什么Docker没有使用UNIX cp
命令的标准语义呢?
/app/vendor
已经存在,Docker是否会表现出不同的行为呢? - Tombart/www/vendor
,它也没有被创建,甚至是空的。也许你有其他的进程/指令会创建vendor
目录? - Krzysztof MiksaCOPY /app /www/
。当您使用通配符时,每个匹配的模式都会解析为源,然后如果它是一个目录,则其整个内容将被复制到目标目录。请记住文档中的注释:只复制目录本身的内容,而不是目录本身。但总的来说,我同意您的观点,这可能会让新用户感到困惑。 - Krzysztof Miksa