我正在尝试创建一个Dockerfile,将所有package.json
文件复制到映像中,但保留文件夹结构。
这就是我现在拥有的
FROM node:15.9.0-alpine as base
WORKDIR /app/
COPY ./**/package.json ./
CMD ls -laR /app
运行条件:sudo docker run --rm -it $(sudo docker build -q .)
但它只复制1个package.json
并将其放在基目录(/app
)中
下面是我正在测试的目录:
├── Dockerfile
├── t1
│ └── package.json
└── t2
└── ttt
├── b.txt
└── package.json
我希望它在容器内看起来像这样:
├── Dockerfile
├── t1
│ └── package.json
└── t2
└── ttt
└── package.json
2条答案
按热度按时间xxslljrj1#
Dockerfile
COPY
指令被记录为使用Gofilepath.Match
函数进行glob扩展。它只支持基本的glob字符*
、?
、[a-z]
,但不支持某些shell支持的扩展,如**
。由于
COPY
只接受一个文件名glob作为输入,而且它喜欢扁平化文件结构,所以我认为没有一种方法可以在单个命令中完成您所描述的那种选择性复制。相反,您需要列出要复制的各个文件。
COPY
将根据需要创建目录,但这意味着您需要在COPY
的两端重复路径。我可以想象一些使用多阶段构建的笨拙方法;我有一个初始阶段,在整个源代码树中复制,然后删除除
package*.json
之外的所有文件,然后将其复制到实际的构建阶段。我打算将我的存储库拆分为较小的模块,首先为每个模块提供单独的Docker文件。iezvtpos2#
经过大量的搜索,我设法找到了一个适合我的解决方案
我最终创建了所有package.json文件的tar
然后使用docker add命令解压缩映像中的tar
add命令将检测到输入是tar文件,并将其提取到映像中。
使用这种方法的缺点是您必须在构建映像之前运行tar命令。