Docker中如何拷贝上一级目录的所有文件?该操作是否符合最佳实践?
Docker使用问题解答
问题1:如何拷贝上一级目录下的所有文件和目录
Docker构建时无法直接访问**构建上下文(context)**以外的目录,你当前把Dockerfile放在docker子目录,如果直接在docker目录下执行docker build,构建上下文就是docker目录本身,自然无法读取上层仓库的内容。
正确操作方式如下:
- 回到代码仓库的根目录执行构建命令,明确指定Dockerfile的路径,将根目录设为构建上下文:
docker build -f docker/Dockerfile -t 自定义镜像名 .
- 调整Dockerfile内容,新增工作目录声明后,原本的
COPY . .就可以正常工作(此时路径.对应的就是仓库根目录的所有内容),基础调整示例如下:
# 该文件路径为 docker/Dockerfile FROM continuumio/miniconda3 # 声明镜像内的工作目录,后续所有操作默认在该目录下执行 WORKDIR /app # 拷贝构建上下文(即仓库根目录)的全部内容到镜像内的工作目录 COPY . . RUN conda env create -f environment.yml ENTRYPOINT [ "python","test.py"]
问题2:该操作方式是否符合Docker最佳实践
- 把Dockerfile放在单独的
docker目录是开源项目非常普遍的做法,本身完全符合Docker规范。 - 全量拷贝仓库代码的操作是否合理取决于使用场景:如果你的镜像运行确实依赖整个仓库的代码,该操作没有问题,但需要在仓库根目录补充
.dockerignore文件,把不需要进入镜像的文件排除,减少镜像体积、加快构建速度,典型的.dockerignore内容示例:
.git .idea .vscode *.log tmp/ __pycache__/
- 效率优化建议:如果要利用Docker层缓存提升构建速度,可以把依赖安装步骤提前,只要依赖文件没有变化就不会重复执行conda环境安装逻辑,调整后的Dockerfile示例:
FROM continuumio/miniconda3 WORKDIR /app # 先单独拷贝依赖文件 COPY environment.yml . RUN conda env create -f environment.yml # 再拷贝全量代码 COPY . . ENTRYPOINT [ "python","test.py"]
内容的提问来源于stack exchange,提问作者OzerT
相关产品推荐
相关产品推荐

