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

挂载本地目录后Docker无法找到entrypoint.sh的问题求助

问题:挂载本地目录后Docker无法定位entrypoint.sh文件

现象

构建包含Django服务的Docker Compose环境,为每个服务配置entrypoint执行数据库迁移。挂载本地目录时容器报错找不到entrypoint.sh,不挂载目录则服务正常启动。

报错信息:

exec /code/dev/entrypoint.sh: no such file or directory

相关配置文件

Dockerfile

FROM python:3.11-slim-bullseye

WORKDIR /code

COPY req.txt .
RUN pip3 install -r req.txt --no-cache-dir

COPY ./dev/entrypoint.sh ./dev/
RUN sed -i 's/\r$//g' ./dev/entrypoint.sh
RUN chmod +x ./dev/entrypoint.sh
# 转换为Unix换行符
RUN apt-get update && apt-get install -y dos2unix && dos2unix ./dev/entrypoint.sh && chmod +x ./dev/entrypoint.sh

COPY . .

ENTRYPOINT ["/code/dev/entrypoint.sh"]

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

docker-compose.yaml

services:
  auth:
    build:
      context: ./Auth
      dockerfile: dev/dockerfile
    container_name: Auth
    env_file:
      - "./Auth/Auth/.env"
    ports:
      - 8001:8000
    expose:
      - 8001
    networks:
      - backend
    volumes:
      - ./Auth:/code

  artifact:
    build:
      context: ./Artifact
      dockerfile: dev/dockerfile
    container_name: Artifact
    env_file:
      - "./Artifact/Artifact/.env"
    ports:
      - 8002:8000
    expose:
      - 8002
    networks:
      - backend
    volumes:
      - ./Artifact:/code

networks:
  backend:

entrypoint.sh

#!/bin/sh
# entrypoint.sh
python manage.py makemigrations
# 执行数据库迁移
python manage.py migrate

# 执行容器主命令(传入的参数)
exec "$@"

原因分析

问题出在本地目录挂载覆盖了容器内的/code目录:

  • 构建镜像时,entrypoint.sh被复制到容器的/code/dev/路径下
  • 启动容器时,volumes: - ./Auth:/code将本地./Auth目录挂载到容器/code,完全覆盖了容器内原来的/code目录内容
  • 如果本地./Auth目录中不存在dev/entrypoint.sh(或路径不匹配),容器就会找不到该文件

解决方案

方案1:确保本地目录结构与镜像一致

检查本地./Auth和./Artifact目录下是否存在dev/entrypoint.sh,确保路径和Dockerfile中COPY的路径完全匹配。如果本地缺少该文件,将entrypoint.sh复制到对应目录。

方案2:仅挂载需要热重载的代码目录

避免挂载整个/code目录,只挂载Django应用的代码目录(比如项目的同名子目录),这样不会覆盖容器内的dev/目录:
修改docker-compose.yaml中的volumes配置:

# Auth服务示例
volumes:
  - ./Auth/Auth:/code/Auth
  - ./Auth/req.txt:/code/req.txt  # 可选:如果需要同步依赖文件

方案3:将entrypoint.sh放到容器的全局路径

修改Dockerfile,将entrypoint.sh复制到不会被挂载覆盖的路径(比如/usr/local/bin/),并更新ENTRYPOINT:

# 替换原来的COPY和ENTRYPOINT部分
COPY ./dev/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN sed -i 's/\r$//g' /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
RUN apt-get update && apt-get install -y dos2unix && dos2unix /usr/local/bin/entrypoint.sh && chmod +x /usr/local/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]

这样即使挂载/code目录,/usr/local/bin/下的entrypoint.sh不会被覆盖,容器能正常找到并执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:07:46