2016-08-02 92 views
7

我是碼頭工人。我已經擴展了PostgreSQL映像,並且能夠在運行映像時創建新的數據庫實例。我需要從該shell腳本中創建表,以執行.sql文件。在運行PostgreSQL映像的時候,它說服務器沒有啓動?我們如何才能在Docker容器中啓動PostgreSQL服務器之後才能執行腳本?在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文件

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

回答

12

official docker image of postgres的docker-entrypoint.sh劇本寫的是:

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 

因此,想要在Docker鏡像中執行的每個.sql文件都可以放在該文件夾中。所以我dockerfile看起來像

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

而且我CreateDB.sql的內容:

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

於是我就開始了我的容器:

docker run -d my-postgres 

檢查:

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

謝謝,它的工作。 –

+0

如何處理這與碼頭組成? – kamal

+0

難道我們只需要複製這一點,因爲我可以在我的情況下db.sql看到搬運工,入口點,initdb.d目錄被複制,但SQL命令沒有運行。 – kamal