使用docker-compose在postgresql数据库中创建表

时间:2015-10-23 18:28:41

标签: postgresql docker docker-compose

我正在使用docker-compose来部署多容器python Flask Web应用程序。我在构建期间很难理解如何在postgresql数据库中创建表,所以我不必用psql手动添加它们。

我的docker-compose.yml文件是:

web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes:
    - /usr/src/flask-app/static
  env_file: .env
  command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
  volumes_from:
    - web
  links:
    - web:web

data:
  restart: always
  image: postgres:latest
  volumes:
    - /var/lib/postgresql
  command: "true"

postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - data
  ports:
    - "5432:5432"

我不想输入psql才能输入:

CREATE DATABASE my_database;
CREATE USER this_user WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE "my_database" to this_user;
\i create_tables.sql

我很感激如何创建表格的指导。

3 个答案:

答案 0 :(得分:25)

  

我不想输入psql才能输入

您可以简单地使用容器的内置初始化机制:

COPY init.sql /docker-entrypoint-initdb.d/10-init.sql

这确保在正确启动DB服务器后执行sql。

看看他们的入口点script。它为正确启动psql做了一些准备,并在/docker-entrypoint-initdb.d/目录中查找以.sh.sql.sql.gz结尾的文件。

文件名中的

10-是因为文件是按ASCII顺序处理的。您可以为其他初始文件命名,例如20-create-tables.sql30-seed-tables.sql.gz,并确保按照您的需要处理它们。

另请注意,调用命令does not指定数据库。如果您正在迁移到docker-compose并且现有的.sql文件也没有指定DB,请记住这一点。

您的文件将在容器的build阶段的首次启动时处理。由于Docker Compose会停止图像然后恢复它们,因此几乎没有区别,但如果在build阶段初始化数据库至关重要,我建议仍使用内置的init方法从dockerfile调用/docker-entrypoint.sh,然后在/docker-entrypoint-initdb.d/目录清理。

答案 1 :(得分:11)

它不适用于Dockerfile中的COPY方法。但是我设法通过添加以下内容来运行init.sql文件:

volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

进入我的docker-compose.yml。 init.sql与我的docker-compose.yml位于同一目录中。 我在这里查看了解决方案:https://gist.github.com/vrulevskyi/307b08abddc9568cf8f9c1b429c1ab56

答案 2 :(得分:9)

我会在构建过程中创建表格。在新目录Dockerfile

中创建新的./database/
FROM postgres:latest
COPY . /fixtures
WORKDIR /fixtures
RUN /fixtures/setup.sh

./database/setup.sh看起来像这样:

#!/bin/bash
set -e

/etc/init.d/postgresql start
psql -f create_fixtures.sql    
/etc/init.d/postgresql stop

将您的create user,create database,create table sql(以及任何其他fixture数据)放入create_fixtures.sql目录中的./database/文件中。

最后,您的postgres服务将更改为使用build

postgres:
    build: ./database/
    ...

注意:有时您需要在sleep 5行之后使用/etc/init.d/postgresql start(甚至更好的脚本来轮询并等待postgresql启动)。根据我的经验,init脚本或psql客户端都会为你处理这个问题,但我知道mysql并不是这样,所以我想我会把它叫出去。