Dockerfile 关于如何使用 COPY 和 VOLUME 的说明

COPY 的使用

首先 COPY 只在 Dockerfile 中存在, 意为将 主机的文件 拷贝到镜像中, 组成镜像的一部分.

区别于 RUN cp 是将镜像内文件从一个位置拷贝到镜像内的另一个位置.

这两种使用方法区别在于一个是 主机 vs 镜像, 一个是 镜像 vs 镜像.

VOLUME 的使用

一般情况, 个人经验, 在使用 Dockerfile 的时候是不使用 VOLUME 的, 因为这是将本地的路径映射到镜像中, 一但镜像脱离主机, 则镜像会出现无法引用的问题.

VOLUME 会在容器与主机建立一个映射关系, 使容器消失之后, 这些文件仍然在主机的文件系统中得以保留.

用途比如: 数据库落地数据, 日志文件, 配置文件等等.

什么时候使用 COPY 什么时候使用 VOLUME

前面说到 COPY 会将主机的文件系统复制到 镜像中, 成为镜像的一部分, 并且占用新的内存大小. 而 VOLUME 则是在主机与 容器中建立一个映射关系.

那么, 在 Dockerfile 构建基础镜像的时候, 可以使用 COPY 对文件进行拷贝. 在需要对容器内外文件互通的时候, 可以使用 VOLUME 进行映射.

但是有个需要注意的问题, 一般 VOLUME 映射一般以 volumes 的形式放在 docker-compose.yml 中, 而不是放在 Dockerfile 中.

例如:

项目目录结构

1
2
3
4
./Dockerfile
./docker-compose.yml
./deps/*
./code/*

一般情况, 一个服务由 docker-compose 通过构建 Dockerfile 来创建:

1
2
3
4
5
6
7
FROM: xxx

## 拷贝必要的文件
COPY ./deps /data

## 映射不在这里做, 不在 image 层完成
# VOLUME ./code /data/project
1
2
3
4
5
6
xxx:
# 构建当前目录的 Dockerfile
image: .
# 映射在这里, 是在 container 层完成的
volumes:
- .:/data/project
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.