挂载本地目录后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
相关产品推荐
相关产品推荐

