【问题标题】:Using a postgres docker as a database for django || Launching dockers before build of another one in the docker-compose.yml file使用 postgres docker 作为 django 的数据库 ||在 docker-compose.yml 文件中构建另一个 docker 之前启动 docker
【发布时间】:2020-08-25 18:54:07
【问题描述】:

我知道这个网站上有类似的问题,但是这些问题的答案已经过时了。

所以我有一个 django 应用程序,我想使用 postgres 作为底层数据库。
此外,还希望将两个程序分别放在不同的 docker 中。
现在 docker 文档有办法做到这一点,但遗憾的是它似乎已经过时了:link

当我在 docker compose 文件正在运行的 docker build 函数中调用 manage.py migrate 时出现问题。 但我收到主机“db”未知/无效的错误。

撰写摘录:

services: 
    db:
        image: postgres
        restart: always
        volumes:
            - DataBase:/var/lib/postgresql/data
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        ports:
            - "5432:5432"

    app:
        build: FehlzeitErfassungProject

        restart: always
        volumes:
            - Logs:/app/logs
            - Backups:/app/Backups
            - Media:/app/MEDIA
        ports:
            - "5432:5432"
        
        depends_on: 
            - db

应用程序dockerfile:

FROM ubuntu

WORKDIR /app

ADD ./requirements.txt ./

RUN apt-get update && \
    apt-get upgrade -y

# getting tzdata to shutup
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe/Berlin
RUN apt-get -y install tzdata
#installing all needed porgramms
RUN apt-get install -y uwsgi python3 python3-pip

RUN python3 -m pip install pip --upgrade
RUN python3 -m pip install -r requirements.txt

COPY ./ ./

RUN ./manage.py migrate

CMD ["uwsgi", "uwsgu.ini"]

PS:似乎只有在应用程序 docker 已经完成构建时才会启动其他 docker

编辑: 数据库设置:

DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.postgresql',
      'NAME': 'postgres',
      'USER': 'postgres',
      'PASSWORD': 'postgres',
      'HOST': '127.0.0.1',
      'PORT': 5432,
  }
}

【问题讨论】:

  • 我认为自从提出Docker Compose wait for container X before starting YHow do you perform Django database migrations when using Docker-Compose? 之类的问题以来,世界的状况并没有真正改变。您根本无法从 Dockerfile 连接到数据库,您需要在容器启动时运行迁移,可能通过入口点脚本。
  • @David 谢谢还没有找到第二个,我目前的工作是你描述的;我启动一个 shell 脚本作为一个入口点,做所有我需要在启动前完成的事情,但我希望它只运行一次,而不是每次重新启动时,因此在构建中运行它会更有效。那么我可以在docker-compose文件中添加命令行中使用的第二个命令,我只需要说docker compose up?

标签: django postgresql docker


【解决方案1】:

我认为您的问题出在 HOST 参数的 DB 配置中的文件“settings.py”中,在这种情况下,您需要具有您在 docker-compose 文件中定义的 postgresql 服务的名称, 是“分贝”。

顺便说一句,我认为在 settings.py 中使用常量是不好的行为,最好在 docker-compose 文件中定义环境变量。

你的情况是:

docker-compose.yml

services: 
    db:
        image: postgres
        restart: always
        volumes:
            - DataBase:/var/lib/postgresql/data
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        ports:
            - "5432:5432"

    app:
        build: FehlzeitErfassungProject

        restart: always
        volumes:
            - Logs:/app/logs
            - Backups:/app/Backups
            - Media:/app/MEDIA
        ports:
            - "5432:5432"
        environment:
            - DB_HOST=db
            - DB_NAME=postgres
            - DB_USER=postgres
            - DB_PASSWORD=postgres
        depends_on: 
            - db

Settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST'),
    }
}

记得在settings.py中导入os

【讨论】:

    【解决方案2】:

    将两个容器端口绑定到主机的同一端口将不起作用。 要在其他容器中访问您的数据库,您应该链接到它。

    version: "3.0"
    services: 
        db:
            image: postgres
            restart: always
            volumes:
                - DataBase:/var/lib/postgresql/data
            environment:
                - POSTGRES_DB=postgres
                - POSTGRES_USER=postgres
                - POSTGRES_PASSWORD=postgres
            ports:
                - "5432:5432"
    
        app:
            build: FehlzeitErfassungProject
    
            restart: always
            volumes:
                - Logs:/app/logs
                - Backups:/app/Backups
                - Media:/app/MEDIA
            ports:
                - "8000:8000" 
            links:
                - "db"
            depends_on: 
                - db
    

    【讨论】:

    • 现代 Docker 中根本不需要links:,他们也解决不了问题中描述的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2019-01-31
    • 1970-01-01
    • 2020-06-02
    • 2022-11-11
    相关资源
    最近更新 更多