如何为Docker COPY命令创建的匿名卷分配有意义的名称?
问题背景
项目结构

大部分文件无关紧要,核心文件包括:
- docker-compose.yml(配置如下)
- FrontServer.Dockerfile(配置如下)
- package.json
docker-compose.yaml
Database服务与本问题无关,提及它是为了排除干扰。
version: "3.5" services: front_server: image: example-front_server-staging container_name: Example-FrontServer-Staging build: context: . dockerfile: "FrontServer.Dockerfile" ports: [ "442:442" ] depends_on: [ Database ] command: sh -c "npm run \"Database migration\" && node FrontServerEntryPoint.js --environment staging" Database: image: postgres:16.2 container_name: Example-Database-Staging ports: [ "5431:5432" ] environment: - TZ="Asia/Tokyo" - POSTGRES_PASSWORD=EXAMPLE-NOTHING_TO_STEAL volumes: - DatabaseData:/data/example.jp volumes: DatabaseData: name: Example-DatabaseData-Staging driver: local
FrontServer.Dockerfile
设计思路是相关容器和卷均为一次性使用,无重要数据存储,源码变更时需生成独立的新容器和卷。
FROM node:18-alpine WORKDIR /var/www/example.com COPY . /var/www/example.com RUN npm install --no-package-lock
问题
每次执行docker compose时,COPY . /var/www/example.com会创建匿名卷(可通过docker volume list查看),其名称为一串随机字符:
DRIVER VOLUME NAME local 7bc56f377f45dff804abc633569757ac7c26d7a77305e91dd83338e4bdbb903d local 3793cc2338491d5065cb81e14e64bde20f2f8fc87dcc393r47d774a0e1f92493
如何为这类卷分配有意义的名称?
解决方案
这些匿名卷是Docker构建镜像时自动创建的构建缓存卷,用于缓存构建步骤的中间状态,加速后续构建。要给它们分配有意义的名称,有两种可行方案:
方案1:在Dockerfile中使用命名缓存挂载(推荐)
借助Docker BuildKit(当前Docker默认启用),在RUN指令中通过--mount=type=cache指定命名缓存卷,同时调整构建步骤顺序优化缓存效率:
FROM node:18-alpine WORKDIR /var/www/example.com # 先复制package.json,优先利用依赖缓存 COPY package.json ./ # 使用命名缓存卷存储node_modules,指定卷名为example-front-node-modules RUN --mount=type=cache,target=/var/www/example.com/node_modules,id=example-front-node-modules,sharing=locked \ npm install --no-package-lock # 最后复制剩余源码文件 COPY . .
构建时会自动创建名为example-front-node-modules的缓存卷,替代匿名卷,同时保留缓存加速构建的能力。
方案2:在docker-compose.yml中配置全局构建缓存卷
在build字段下添加cache_from和cache_to配置,指定统一的命名缓存卷存储所有构建步骤的缓存:
services: front_server: build: context: . dockerfile: "FrontServer.Dockerfile" # 配置BuildKit缓存,指定命名卷 cache_from: - type=volume,src=example-front-build-cache cache_to: - type=volume,dest=example-front-build-cache,mode=max # 其他配置保持不变
此方式会将整个构建过程的缓存都存储在example-front-build-cache卷中,所有构建步骤的缓存都集中到这个命名卷里,便于管理。
如果不需要构建缓存,也可以每次构建时添加--no-cache参数,但会导致构建速度变慢,不推荐在日常开发中使用。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

