2016-08-02 21 views
7

Jestem nowy w oknie dokowanym. Mam rozszerzony obraz PostgreSQL i mogę utworzyć nową instancję DB podczas uruchamiania obrazu. Muszę utworzyć tabele w tym DB ze skryptu powłoki, który wykona plik .sql. Podczas pracy z obrazem PostgreSQL jest napisane, że serwer nie został uruchomiony? jak możemy uruchomić skrypt tylko po uruchomieniu serwera PostgreSQL w kontenerze Docker?Utwórz tabelę w oknie dokowanym 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 plik

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

Odpowiedz

12

W docker-entrypoint.sh skryptu z official docker image of postgres jest napisane:

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 

Tak więc każdy plik .sql, który chcesz wykonać wewnątrz obrazu w doku można po prostu umieścić w tym folderze. Więc moja dockerfile wygląda

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

a zawartość mojego CreateDb.sql:

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

tak po prostu zacząć mój pojemnik z:

docker run -d my-postgres 

Aby sprawdzić:

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

dziękuję, zadziałało. –

+0

Jak sobie z tym poradzić przy komponowaniu dockera? – kamal

+0

Czy wystarczy skopiować to, jak widzę w moim przypadku db.sql jest kopiowany w katalogu docker-entrypoint-initdb.d, ale polecenia sql nie działały. – kamal

Powiązane problemy