Docker-Compose构建时如何让Dockerfile访问外部目录?
Docker-Compose构建时无法访问上级目录的问题解决
问题背景
现有Docker-Compose配置,构建ac镜像时,其Dockerfile需要访问上级2级目录的type(项目依赖该目录),希望不修改代码路径的前提下解决访问问题。
目录结构如下:
Documents/ ├── .env ├── docker-compose.yml ├── ac/ ├── dc/ └── type/
当前Docker-Compose配置:
version: '3.8' services: ac: build: ./ac container_name: ac ports: - "4112:4112" volumes: - type: bind source: .env target: /app/.env dc: build: ./dc container_name: dc ports: - "2001:2001"
ac服务的Dockerfile内容:
FROM python:3.11-bullseye WORKDIR /app COPY ../type/example/dog ./type/example/dog COPY requirements.txt . RUN pip install --no-cache-dir --upgrade -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "4112"]
问题:执行docker-compose时,ac服务无法访问type/example/dog目录,请问原因是什么?如何解决?
问题原因
Docker构建有**上下文(context)**限制:当docker-compose里指定build: ./ac时,构建上下文会被设置为ac目录。出于安全性和构建可移植性考虑,Docker禁止在上下文之外的路径执行COPY操作,所以../type/example/dog这种跳出上下文的路径会被直接拒绝,导致无法访问目标目录。
解决方法
无需修改代码路径,只需调整构建上下文到项目根目录,并指定Dockerfile的具体路径:
1. 修改Docker-Compose配置
将ac服务的build配置改为指定根上下文和Dockerfile路径:
version: '3.8' services: ac: build: context: . # 构建上下文设为项目根目录(Documents) dockerfile: ./ac/Dockerfile # 指定ac目录下的Dockerfile位置 container_name: ac ports: - "4112:4112" volumes: - type: bind source: .env target: /app/.env dc: build: ./dc container_name: dc ports: - "2001:2001"
2. 调整Dockerfile中的COPY路径
因为构建上下文变为根目录,所有COPY路径要基于根目录来编写:
FROM python:3.11-bullseye WORKDIR /app # 直接从根上下文复制type目录内容 COPY type/example/dog ./type/example/dog # 复制ac目录下的requirements.txt COPY ac/requirements.txt . RUN pip install --no-cache-dir --upgrade -r requirements.txt # 复制ac目录下的所有应用代码 COPY ac/ . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "4112"]
这样调整后,Docker构建时就能访问到根目录下的type目录,同时也能正确复制ac服务的代码文件,完全不需要改动原项目的目录结构。
内容的提问来源于stack exchange,提问作者rainbow12
相关产品推荐
相关产品推荐

