You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose启动时make目标不存在及WORKDIR失效问题求助

Docker容器中Makefile规则找不到问题排查与解决

目录结构

--docker
|    |---docker-compose.yml
|    |---Dockerfile
|
|----Makefile
|---run.py

相关文件内容

docker-compose.yml

version: '3'
services:
  ml_api:
    build:
      context: ../
      network: host
      dockerfile: docker/Dockerfile
    ports:
      - "5000:5000"   # expose webserver to localhost host:container
    command: bash -c "make run-service-development"

Makefile

# Specify phony list to ensure make recipes do not conflict with real file names
.PHONY: run-service-development

# start up Flask API service
run-service-development:
    @echo "+ $@"
    python run.py

Dockerfile

FROM python:3.9.5-slim-buster

RUN mkdir -p /opt/app
COPY requirements.txt /opt/app/requirements.txt
RUN pip install --upgrade pip

# ensure we can run the make commands
RUN apt-get update -y && \
    apt-get install -y make && \
    apt-get install -y libffi-dev gcc && \
    # for swagger
    apt-get install -y curl

RUN pip install -r /opt/app/requirements.txt
COPY Makefile /opt/app/Makefile
COPY api /opt/app/api
COPY run.py /opt/app/run.py
WORKDIR /opt/app

错误日志

✔ Network docker_default     Created                                                                                                               0.2s 
 ✔ Container docker-ml_api-1  Created                                                                                                               0.1s 
Attaching to docker-ml_api-1
docker-ml_api-1  | make: *** No rule to make target 'run-service-development'.  Stop.

问题原因

虽然Dockerfile中通过WORKDIR /opt/app设置了容器默认工作目录,但容器启动时执行command指令的工作目录未切换到该路径,导致make命令在根目录/下查找Makefile,无法找到定义的run-service-development规则。

解决方法

方法1:在docker-compose.yml中显式指定工作目录

在ml_api服务配置中添加working_dir字段,强制指定命令执行的工作目录:

version: '3'
services:
  ml_api:
    build:
      context: ../
      network: host
      dockerfile: docker/Dockerfile
    ports:
      - "5000:5000"
    working_dir: /opt/app  # 显式指定工作目录
    command: bash -c "make run-service-development"

方法2:修改command指令,先切换目录再执行make

直接在命令中增加目录切换步骤,确保make在正确路径下执行:

command: bash -c "cd /opt/app && make run-service-development"

方法3:在Dockerfile中设置CMD替代docker-compose的command

在Dockerfile末尾添加CMD指令,让镜像默认启动命令基于WORKDIR执行,避免依赖docker-compose的command配置:

# Dockerfile末尾新增
CMD ["make", "run-service-development"]

之后删除docker-compose.yml中的command字段即可。

验证WORKDIR是否生效(可选)

在Dockerfile的WORKDIR /opt/app后添加RUN pwd,构建时查看输出是否为/opt/app,确认目录切换操作正常:

WORKDIR /opt/app
RUN pwd  # 构建时验证目录是否正确

内容的提问来源于stack exchange,提问作者KansaiRobot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:37:19