如何将含.toml文件的目录完整复制到Docker容器中?
解决方案:复制含.toml文件的目录并保留结构
Docker的COPY **/*.toml ./指令仅会将匹配的.toml文件直接复制到目标目录根下,不会保留原有的目录层级——因为该通配符模式仅匹配文件,不携带路径信息。以下是两种可行的解决方法:
方案一:多阶段构建(推荐,灵活可控)
借助多阶段构建筛选目标目录,完整保留原结构,同时可灵活控制是否复制目录内的所有内容:
FROM alpine:latest AS builder # 将主机源码复制到构建阶段的临时目录 COPY . /source # 创建目标目录,筛选并复制所有含.toml的目录 RUN mkdir -p /target && \ # 找到所有.toml文件,提取其父目录并去重 find /source -type f -name "*.toml" | sed 's|/[^/]*\.toml$||' | sort -u | while read dir; do \ # 计算相对路径,在目标目录下创建对应层级 rel_dir="${dir#/source/}" mkdir -p "/target/$rel_dir" # 复制该目录下的所有内容到目标路径 cp -r "$dir"/* "/target/$rel_dir" done # 最终业务镜像 FROM python:3.8 # 安装依赖 RUN pip install toml # 从构建阶段复制筛选后的目录结构 COPY --from=builder /target ./
方案二:.dockerignore配合COPY(适合简单场景)
如果仅需保留含.toml文件的目录及其中的.toml文件(无需目录内其他文件),可通过忽略规则实现:
- 创建
.dockerignore文件:
# 先排除所有内容 * # 包含所有.toml文件 !**/*.toml # 必须包含.toml文件的父目录(Docker无法复制不存在的目录下的文件) !**/
- 修改Dockerfile:
FROM python:3.8 RUN pip install toml # 复制所有被允许的内容(含.toml的目录及其中的.toml文件) COPY . ./
注意:此方案会排除目录内的非.toml文件,若需保留目录完整内容,请使用方案一。
内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

