2016-08-02 25 views
7

Tôi mới vào docker. Tôi đã mở rộng hình ảnh PostgreSQL và có thể tạo ra thể hiện DB mới trong khi chạy image.I cần tạo các bảng trong DB đó từ kịch bản lệnh shell sẽ thực thi tệp .sql. Trong khi chạy hình ảnh PostgreSQL nó nói rằng máy chủ không bắt đầu? cách chúng tôi có thể thực thi tập lệnh chỉ sau khi máy chủ PostgreSQL khởi động trong vùng chứa docker?Tạo bảng trong hình ảnh docker PostgreSQL

Dockerfile:

FROM postgres:9.3 
ENV POSTGRES_USER docker 
ENV POSTGRES_PASSWORD docker 
ENV POSTGRES_DB docker 
RUN apt-get update && apt-get install -y postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 
ADD initialize.sh /home/MM0312/docker-entrypoint-initdb.d/initialize.sh 
CMD ["/home/MM0312/docker-entrypoint-initdb.d/initialize.sh"] 

initialize.sh

#!/bin/bash 
set -e 
set -x 

echo "******PostgreSQL initialisation******" 
gosu docker psql -h localhost -p 5432 -U docker -d $docker -a -f createDatabase.sql 

createDatabase.sql tập tin

REATE TABLE web_origins (
    client_id character varying(36) NOT NULL, 
    value character varying(255) 
); 

Trả lời

12

Trong kịch bản docker-entrypoint.sh của official docker image of postgres có chép rằng:

psql+=(--username "$POSTGRES_USER" --dbname "$POSTGRES_DB") 

     echo 
     for f in /docker-entrypoint-initdb.d/*; do 
      case "$f" in 
       *.sh)  echo "$0: running $f"; . "$f" ;; 
       *.sql) echo "$0: running $f"; "${psql[@]}" < "$f"; echo ;; 
       *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;; 
       *)  echo "$0: ignoring $f" ;; 
      esac 
      echo 
done 

Vì vậy, mọi tệp .sql bạn muốn thực thi bên trong hình ảnh docker chỉ có thể được đặt bên trong thư mục đó. Vì vậy, dockerfile của tôi trông giống như

FROM postgres:9.3 
ENV POSTGRES_USER docker 
ENV POSTGRES_PASSWORD docker 
ENV POSTGRES_DB docker 
ADD CreateDB.sql /docker-entrypoint-initdb.d/ 

Và nội dung của CreateDB.sql tôi:

CREATE TABLE web_origins (
    client_id character varying(36) NOT NULL, 
    value character varying(255) 
); 

Vì vậy, tôi chỉ bắt đầu container của tôi với:

docker run -d my-postgres 

Để kiểm tra:

docker exec -it 6250aee43d12 bash 
[email protected]:/# psql -h localhost -p 5432 -U docker -d docker 
psql (9.3.13) 
Type "help" for help. 

docker=# \c 
You are now connected to database "docker" as user "docker". 
docker=# \dt 
      List of relations 
Schema | Name  | Type | Owner 
--------+-------------+-------+-------- 
public | web_origins | table | docker 
(1 row) 
+0

cảm ơn, nó đã hoạt động. –

+0

Làm thế nào để xử lý việc này với docker soạn? – kamal

+0

Chúng ta chỉ cần sao chép điều này, như tôi có thể thấy trong trường hợp của tôi db.sql được sao chép trong thư mục docker-entrypoint-initdb.d, nhưng các lệnh sql không chạy. – kamal

Các vấn đề liên quan