Docker postgres不在docker-entrypoint-initdb.d中运行init文件

时间:2016-01-09 08:36:34

标签: postgresql docker docker-compose

基于Docker的Postgres documentation,我可以在*.sql中创建任何/docker-entrypoint-initdb.d文件并自动运行。

我的init.sql包含CREATE DATABASE ronda;

在我的docker-compose.yaml中,我有

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

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

postgres:
  restart: always
  build: ./postgres/
  volumes_from:
    - data
  ports:
    - "5432:5432"

data:
  restart: always
  build: ./postgres/
  volumes:
    - /var/lib/postgresql
  command: "true"

和我的postgres Dockerfile,

FROM library/postgres

RUN mkdir -p /docker-entrypoint-initdb.d
COPY init.sql /docker-entrypoint-initdb.d/

正常运行docker-compose builddocker-compose up,但未创建数据库ronda

3 个答案:

答案 0 :(得分:2)

如果您的初始化要求只是创建POSTGRES_DB架构,那么您可以使用documentation中描述的postgres: restart: always build: ./postgres/ volumes_from: - data ports: - "5432:5432" environment: POSTGRES_DB: ronda 环境变量。

postgres服务的 docker-compose.yml 文件位将为:

restart: always

另外,请不要将data用于true容器,因为此容器不运行任何服务(仅true命令)。这样做基本上告诉Docker在无限循环中运行<?php defined('BASEPATH') OR exit('Not your cup of tea'); class Search extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('inflector'); } public function song($song) { $song = underscore($this->input->post('song'));//name of field in view which becomes sheila_on_7 //use variable for DB search or what ever you need //$data['song'] = $this->Song_m->get('title', $this->input->post('song')); //$this->load->view('search', $data); } } 命令。

答案 1 :(得分:0)

这就是我在项目中使用 postgres 并预加载数据库的方法。

档案:docker-compose.yml

  db:
    container_name: db_service
    build:
      context: .
      dockerfile: ./Dockerfile.postgres
    ports:
      - "5432:5432"
    volumes:
      - /var/lib/postgresql/data/

Dockerfile加载名为pg_dump.backup(二进制转储)或psql_dump.sql(纯文本转储)的文件(如果存在于项目的根文件夹中)。

文件: Dockerfile.postgres

FROM postgres:9.6-alpine

ENV POSTGRES_DB DatabaseName

COPY pg_dump.backup .
COPY pg_dump.sql .

RUN [[ -e "pg_dump.backup" ]] && pg_restore pg_dump.backup > pg_dump.sql

# Preload database on init
RUN [[ -e "pg_dump.sql" ]] && cp pg_dump.sql /docker-entrypoint-initdb.d/

如果需要重试加载转储,可以使用以下命令删除当前数据库:

docker-compose rm db

然后您可以运行docker-compose up重试加载数据库。

答案 2 :(得分:0)

postgres 11也有同样的问题。

一些对我有帮助的要点:

  • 运行:
    • line 17, in <module> c.execute("CREATE TABLE IF NOT EXISTS orders (ID INT, DATE TEXT, CHECK TEXT, AMOUNT REAL,DESC TEXT)") sqlite3.OperationalError: near "TEXT": syntax error
    • docker-compose rm
    • docker-compose build
  • 显而易见:不要在分离模式下运行compose。您想查看日志。

在将步骤docker-compose up添加到其工作混合物中之后,最终。