docker container run ubuntuで直ちに終了する理由について
Dockerの学習にてUbuntuコンテナを起動する機会があり、そのときのメモです。
概要
docker container run ubuntu
でUbuntuコンテナを起動する際に、-it
オプションを付けないと、なぜ、コンテナが起動して直ちに終了するのか。
疑問
上記runコマンドでは、起動後のコマンドを指定しない場合はDockerイメージに定義されたデフォルトコマンドが、コンテナ起動後に実行される。
Ubuntuイメージのデフォルトコマンドは、/bin/bash
。
ということは、Bashシェルが起動してコンテナはその状態でUpのままになるのでは?
調査結果
runコマンドに-it
オプションがない場合、バックグラウンドでの実行となるが、この場合標準入力が有効になっていない(?)ことになるらしい。
その場合、/bin/bash
でBashシェルが起動するものの、直ちに終了する仕様らしい。
そのため、上記コマンドではコンテナが起動して直ちに終了するみたい。
備考
runコマンドの末尾にコマンドを続けると、デフォルトコマンドの代わりにそのコマンドが実行される。
例えば、pwd
を続けると、カレントディレクトリが出力される。(コンテナ自体はその後直ちに終了する。)
pwd
は、Unix系シェルのコマンドであるが、これが使用できるということは、すなわちUbuntuの場合はBashシェルが起動しているということを意味する。
ということは、Ubuntuコンテナを起動するとBashシェルが自動で起動するようになっているということかも。(調べてないが)
Flaskアプリ用にPostgreSQLを用意
FlaskベースのWebアプリ用のデータベースとしてPostgreSQLを用意した時のメモ。
PostgreSQLのインストール
以下サイトを参考に実施。
管理者ユーザーでログイン
C:\PostgreSQL\15\bin\psql.exe -U postgres # Passwordを入力
ロールを作成
CREATE ROLE flaskuser WITH LOGIN PASSWORD 'password';
データベースを作成
WITH OWNER flaskuser
をつけないと、flask db migrate
で「psycopg2.errors.InsufficientPrivilege: スキーマ public へのアクセスが拒否されました」エラーになりました。
CREATE DATABASE flasktutorial WITH OWNER flaskuser; # \lでデータベース一覧を確認する
アクセスできることを確認
# ctrl+cで管理者ユーザーからログアウトしておく C:\PostgreSQL\15\bin\psql.exe -U flaskuser -d flasktutorial # Passwordを入力
FlaskアプリにてDB接続を実装
SQLALCHEMY_DATABASE_URI
に、接続情報を記載
# from pathlib import Path from flask import Flask from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy from flask_wtf.csrf import CSRFProtect db = SQLAlchemy() csrf = CSRFProtect() def create_app(): app = Flask(__name__) app.config.from_mapping( SECRET_KEY="flaskapp123456789", SQLALCHEMY_DATABASE_URI="postgresql+psycopg2://{user}:{password}@{host}/{name}".format( user="flaskuser", password="password", host="127.0.0.1", name="flasktutorial", ), SQLALCHEMY_TRACK_MODIFICATIONS=False, SQLALCHEMY_ECHO=True, WTF_CSRF_SECRET_KEY="flaskapp123456789", ) csrf.init_app(app) db.init_app(app) Migrate(app, db) from apps.crud import views as crud_views app.register_blueprint(crud_views.crud, url_prefix="/crud") return ap
DB周りのflaskコマンドを実行
flask db init flask db migrate flask db upgrade
Flaskのデバッグモードでの起動方法のメモ
Flaskのデバッグモードでの起動にあたってのメモです。
参考
SQLAlchemy, psycopg2の役割についてのメモ
PythonからDBを操作する場合、SQLAlchemyを使用するケースが多いです。 PostgreSQLで使用してみたいと思い、SQLAlchemyのインストール方法とかをググったところ、psycopg2というライブラリもインストールが必要とのことでした。 それぞれのライブラリの役割がよくわからなかったので、調べてみました。
そもそも
1
プログラミング言語からデータベースにアクセスするには専用のソフトウェアが必要。
そのようなソフトウエアはドライバと呼ばれる。
プログラミング言語ごと、データベースごとに様々なドライバがある。
2
Pythonからデータベースにアクセス・操作するためのAPIの仕様を定めたものをDBAPIと呼ぶ。
この仕様に則り、APIが用意されることで、Pythonからは同じコードを使用して異なる種類のデータベースにアクセスすることができるようになる。(らしい。)
psycopg2
DBAPIの実装の1つで、PythonからPostgreSQLを利用するためのライブラリ。
ドライバでもある。(とChatGPTが言ってた。)
ちなみに、psycopg2を再実装してモダンな機能が追加されたpsycopg3もある。
SQLAlchemy
Python用のSQLツールキットかつORM(Object-Relational Mapping)ツール。
様々なデータベースエンジンとのやり取りを簡素化することができる。
なお、PostgreSQLを操作する場合は、内部でpsycopg2を使用している。なので、psycopg2もインストールする必要がある。
SQLAlchemyの内部実装
以下の構成要素があるらしい。
- Engine
- Pool
- Dialect
- DBAPI
詳細は以下参照 docs.sqlalchemy.org
Flaskのリクエストの情報の取り出されるかについてのメモ
Flaskのrequestについての妄想メモです。
flask.requestについて
以下のようなコードを例とします
from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): user_email = request.form['user_email'] # 以下省略
このとき、request
には、クライアントから送られたリクエストの情報が入っています。
ただ、コードを単純に見るとrequest
はimportされてそのまま利用されているだけで、特にリクエストの情報を入れているようには見えません。
そのため、request
はNone
であるように見えます。
しかし、当然ですが、実際にはリクエストの情報を取り出して利用できます。
これは、裏でFlaskが働いて、リクエストの情報をrequest
に入れているのかと思われます。
(参考文献なしなので妄想。)
Flask-WTformsについて
以下のようなコードを例とします。
@auth.route('/signup', methods=['GET', 'POST']) def signup(): form = SignUpForm() if form.validate_on_submit(): user = User( username=form.username.data, email=form.email.data, password=form.password.data, ) # 以下省略
上記コードでは、フォームに入力した情報がリクエストを経由してform
に格納される。
コード上では、form = SignUpForm()
とあるのみで、リクエストの情報を格納しているようには見えない。しかし、実際には、Flask-WTformsが自動で格納しているらしい。
公式ドキュメントに以下の記載があった。
If formdata is not specified, this will use flask.request.form and flask.request.files.
VSCodeでPythonの開発を行う手順
前提
手順
- アプリ用のフォルダを適当なディレクトリに作成する
- ディレクトリに移動して、
python -m venv <仮想環境名>
を実行する - PowerShellにて、
<仮想環境名>\Scripts\Activate.ps1
を実行する pip install flask flask-sqlalchemy
など、必要なライブラリをインストールするpip freeze > requirements.txt
を実行するgit init
を実行して、アプリをgit管理下に置く- コマンドプロンプトにて、ディレクトリ直下で
curl -L http://www.gitignore.io/api/python,flask,visualstudiocode > .gitignore
を実行して、.gitignoreを作成する - .gitignoreに、<仮想環境名>\を追加する