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
テーブルの作成方法に関するガイダンスをいただければ幸いです。
入力するために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.sql
や30-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/
ディレクトリでクリーンアップします。
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