web-dev-qa-db-ja.com

docker-composeを使用してpostgresqlデータベースにテーブルを作成する

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

テーブルの作成方法に関するガイダンスをいただければ幸いです。

26
blahblahblah

入力するためにpsqlを入力する必要はありません。

コンテナの組み込みinitメカニズムを使用するだけです:

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などの他のinitファイルに名前を付けて、必要な順序で処理されます。

また、コマンドの呼び出し does not はデータベースを指定することに注意してください。たとえば、docker-composeに移行していて、既存の.sqlファイルでもDBが指定されていない場合は、このことに留意してください。

ただし、ファイルはbuildステージのinstaedコンテナの最初の開始時に処理されます。 Docker Composeは画像を停止してから再開するため、ほとんど違いはありませんが、buildステージでDBを初期化することが重要な場合は、/docker-entrypoint.shを呼び出して組み込みのinitメソッドを使用することをお勧めしますDockerfileを作成し、/docker-entrypoint-initdb.d/ディレクトリでクリーンアップします。

29
Daerdemandt

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

14
Victor Di