我有一个Django项目,它运行在docker-compose.yml中的Docker容器中,带有PostgreSQL、pgadmin4和redis.我有start.sh个执行和运行迁移的脚本:

Start.sh:

#!/bin/bash
# Creating migrations if they are
python manage.py makemigrations
# Apply migrations
python manage.py migrate

After building the image and runing docker-compose up command django project give me an error: exec ./Start.sh: no such file or directory but my start.sh file is in the same directory where Dockerfile and docker-compose.yml are. PostgreSQL, pgadmin4 and Redis runs successfully. How to solve this problem? My system is Windows 10.

Dockerfile:

FROM python:3.11.3-alpine

ENV PYTHONBUFFERED=1

WORKDIR /code

COPY requirements.txt .

RUN pip install -r requirements.txt --upgrade

COPY . .

COPY start.sh .

RUN chmod +x start.sh

ENTRYPOINT [ "./start.sh" ]

EXPOSE 8000

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

docker-compose.yml:

services:
  api:
    image: meduzzen-backend-api
    container_name: django
    tty: true
    stdin_open: true
    volumes:
      - .:/code
      - ./code:/apps
    ports:
      - "8000:8000"
    depends_on:
      - postgres-db
      - redis
    env_file:
      - .env
    networks:
      - api-db-redis

  postgres-db:
    image: postgres:latest
    container_name: postgres_db
    ports:
      - "5432:5432"
    volumes:
      - data:/var/lib/postgresql/data
    env_file:
      - .env
    networks:
      api-db-redis:
        # Have access the database using pgadmin4
        ipv4_address: 172.24.0.6

  pg-admin:
    image: dpage/pgadmin4:latest
    container_name: pg_admin
    env_file:
      - .env
    ports:
      - "5050:5050"
    networks:
      - api-db-redis

  redis:
    image: redis:latest
    container_name: redis_cache
    ports:
      - "6379:6379"
    networks:
      - api-db-redis

volumes:
  data:

networks:
  api-db-redis:
    ipam:
      driver: default
      config:
        - subnet: 172.24.0.0/24

我try 在start.sh指令的末尾添加\r.在Dockerfile中更改文件目标.

推荐答案

你的问题是,你使用的是阿尔卑斯山的镜像,而他们默认情况下没有安装bash.

在脚本的第一行中,您已经指出脚本应该使用bash运行,因此它失败了.

将脚本中的第一行更改为

#!/bin/sh 

而且它会起作用的.

您应该知道的一件事是,当容器启动时,Docker只运行一个命令.当您同时拥有入口点和CMD时,它们将连接到单个命令中.在您的例子中,命令是

./start.sh python3 manage.py runserver 0.0.0.0:8000

我认为您认为它们将作为两个单独的命令运行.他们不会的.

Django相关问答推荐

Django相关对象引用模板

Django Admin中显示的DateField下面的小提示是什么?

如何在Django表单中传递self.请求数据?

在Django测试get方法中获取HttpResponseNotFound

使用 Pytest 在 Django 中编写测试用例时如何加载特定目录中的所有固定装置

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

如何使用 matplotlib 在绘图的角落插入小图像?

Django rest框架覆盖ViewSet中的page_size

Django:在模板中显示当前语言环境

文档中的 Mongoengine creation_time 属性

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Django -- User.DoesNotExist 不存在?

django 模板 if 或语句

Django - 配置不当:模块django.contrib.auth.middleware

django 模板列表变量中的最后一个元素

如何查询名称包含python列表中任何单词的模型?

响应发送到客户端后在 Django 中执行代码

Python/Django - 避免在源代码中保存密码

Django - 指定 Django 管理员应该使用哪个模型管理器

django/文件上传权限