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
相关产品推荐
相关产品推荐

