【问题标题】:Django project with PostgreSQL database in Docker container - directory /var/lib/postgresql/data exists but is not emptyDocker 容器中带有 PostgreSQL 数据库的 Django 项目 - 目录 /var/lib/postgresql/data 存在但不为空
【发布时间】:2018-05-30 18:32:36
【问题描述】:

我尝试在 Docker 容器中运行 Django 项目。到目前为止,一切正常。我没有更改任何内容,但底部显示错误。有什么想法有什么问题吗?我的 PostgreSQL 设置是这样的:

DATABASES = {
 "default":
 {
  'ENGINE': 'django.db.backends.postgresql',
  "NAME": 'myproject',
  "HOST": "db",
  "PORT": "5432",
 }
 }

DATABASES = {'default': dj_database_url.config(default='postgres://addw...@ec2-31-11-107-127.compute-1.amazonaws.com:5432/qdsfks')}

docker-compose.yml:

version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: myproject
      POSTGRES_PASSWORD: somepass
    volumes:
      - "./local_pgdata:/var/lib/postgresql/data/pgdata"
  django:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8001
    volumes:
      - .:/code
    ports:
      - "8001:8001"
    depends_on:
      - db

日志:

db_1      | The files belonging to this database system will be owned by user "postgres".
db_1      | This user must also own the server process.
db_1      | 
db_1      | The database cluster will be initialized with locale "en_US.utf8".
db_1      | The default database encoding has accordingly been set to "UTF8".
db_1      | The default text search configuration will be set to "english".
db_1      | 
db_1      | Data page checksums are disabled.
db_1      | 
db_1      | initdb: directory "/var/lib/postgresql/data" exists but is not empty
db_1      | If you want to create a new database system, either remove or empty
db_1      | the directory "/var/lib/postgresql/data" or run initdb
db_1      | with an argument other than "/var/lib/postgresql/data".

【问题讨论】:

  • 根据报错需要删除“/var/lib/postgresql/data”的内容来创建一个新的数据库系统。你能告诉我们你的 postgres Dockerfile 的内容吗?为什么要将“./local_pgdata”映射到“/var/lib/postgresql/data/pgdata”?
  • @TobiasErnst 我该怎么做?我正在将“./local_pgdata”映射到“/var/lib/postgresql/data/pgdata”,因为我可以将文件从这个目录导入到我在 Docker 容器中的 PostgreSQL 数据库中。
  • 如何导入文件?请与我们分享命令。
  • @TobiasErnst \copy backend_table (field1,field2) FROM '/var/lib/postgresql/data/pgdata/file.csv' CSV HEADER;

标签: python django python-3.x postgresql heroku


【解决方案1】:

如果您想使用现有的主机数据库,您应该只将主机文件系统映射到您的 docker 容器。否则,我建议删除卷映射并使用自定义 Dockerfile 加载现有内容,如下所述。

./web/proj/settings.py

改进:还需要在settings.py中设置USER和PASSWORD

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ['POSTGRES_NAME'],
        'USER': os.environ['POSTGRES_USER'],
        'PASSWORD': os.environ['POSTGRES_PASSWORD'],
        'HOST': os.environ['POSTGRES_HOST'],
        'PORT': os.environ['POSTGRES_PORT'],
    }
}

./docker-compose.yml

db:
    restart: always
    build:
      context: ./db
      dockerfile: Dockerfile
    env_file: .env
    expose:
      - "5432"

django:
    restart: always
    build:
      context: ./web
      dockerfile: Dockerfile
    volumes:
      - .:/app
    command: bash -c "cd ./web && ./manage.py makemigrations && ./manage.py migrate && ./manage.py runserver"
    expose:
      - "8000"
    env_file: .env
    depends_on:
      - db
    links:
      - db

./.env

POSTGRES_NAME=db_name
POSTGRES_USER=db_user
POSTGRES_PASSWORD=password
POSTGRES_HOST=db
POSTGRES_PORT=5432

./db/Dockerfile

FROM postgres
RUN mkdir /app
WORKDIR /app
ADD ./ /app/ # add all sources if you need them
ADD ./path-to-your-csv.csv /app/
RUN [import content here]

在这里您可以找到一种通过 initdb 加载自定义 sql 代码的方法:Load custom sql script。您还将找到一种加载 csv 文件内容的方法。

此外,您应该考虑使用固定装置而不是加载 csv 或 sql 脚本。这会更容易。

希望这将有助于解决您的问题。

【讨论】:

  • 如果我不必将数据从文件复制到数据库,解决此问题的最简单方法是什么?
  • 只需删除数据库容器的卷映射并通过调用启动项目:'docker-compose --project-name projectname up --build'。
  • 你的意思是评论这个volumes: - "./local_pgdata:/var/lib/postgresql/data/pgdata"
  • 是的。我想说没有理由映射主机文件系统数据。
猜你喜欢
  • 2020-10-23
  • 2022-08-02
  • 2019-04-16
  • 1970-01-01
  • 2017-12-09
  • 2021-10-24
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多