Dockerfile复制并保留文件夹结构

jucafojl  于 2023-03-17  发布在  Docker
关注(0)|答案(2)|浏览(263)

我正在尝试创建一个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
xxslljrj

xxslljrj1#

Dockerfile COPY指令被记录为使用Go filepath.Match函数进行glob扩展。它只支持基本的glob字符*?[a-z],但不支持某些shell支持的扩展,如**
由于COPY只接受一个文件名glob作为输入,而且它喜欢扁平化文件结构,所以我认为没有一种方法可以在单个命令中完成您所描述的那种选择性复制。
相反,您需要列出要复制的各个文件。COPY将根据需要创建目录,但这意味着您需要在COPY的两端重复路径。

COPY t1/package*.json t1/
COPY t2/ttt/package*.json t2/ttt/

我可以想象一些使用多阶段构建的笨拙方法;我有一个初始阶段,在整个源代码树中复制,然后删除除package*.json之外的所有文件,然后将其复制到实际的构建阶段。我打算将我的存储库拆分为较小的模块,首先为每个模块提供单独的Docker文件。

iezvtpos

iezvtpos2#

经过大量的搜索,我设法找到了一个适合我的解决方案
我最终创建了所有package.json文件的tar

tar --exclude node_modules -cf package.json.tar  */package.json

然后使用docker add命令解压缩映像中的tar

ADD package.json.tar .

add命令将检测到输入是tar文件,并将其提取到映像中。
使用这种方法的缺点是您必须在构建映像之前运行tar命令。

相关问题