haskell-jp / beginners #14 at 2021-02-21 13:40:49 +0900

駒鳥(hxf_vogel)
DB用のdockerコンテナを立ち上げた状態で,Servant用dockerイメージを作成するべく
docker build -t servant-app . コマンドでdefineTableFromDB'を呼ぶとDBコンテナが見つからずにSQL error でコンパイルに失敗します.
ローカルで同一のServant appをbuildするとlocalhost:5432でDBコンテナにアクセス成功するのですが,どのように設定すれば良いかご存知の方いらっしゃいますか?
なお,servant側でのdb設定用のyamlは以下です
port    : _env:DBPORT:"5432"
host    : _env:DBHOST:"localhost"
user    : _env:DBUSER:"postgres"
dbname  : _env:DBNAME:"postgres"
pass    : _env:DBPASS:"mypassword"
sslmode : _env:DBSSLMODE:"disable"
dockerのポート転送機能で、コンテナ内のポートをホストのポートに紐付ける必要があります。
docker run -p ホストのポート:コンテナのポート イメージ名 と実行してください。
駒鳥(hxf_vogel)
ありがとうございます,このコマンドを叩くとpostgresql側と干渉しているよーと教えられたので,もう少しポート設定とコンテナ管理をいじってみます.docker初心者には壁が高い..
なんだかhaskellと関係ない質問になってしまって恐縮です:droplet:
「Docker container内で、(defineTableFromDB'を使った)Haskellのコードをコンパイルしようとしている」という認識であってますか?
駒鳥(hxf_vogel)
はい、仰る通りです。ローカルではビルドが通るので別コンテナにあるpsqlとの通信で躓いていている現状です。コンテナ内外でポート設定があることをついさっき知ったので調査中です
それでしたら、ビルド環境コンテナとDBランタイムコンテナが通信できるように設定する必要があるので、
• docker networkを設定する
• --linkを使う(レガシー)
が関係しそうですね。

または別の手法として、
「ghcなどビルドツール」と「postgresql server」両方を含んだ大きな「ビルド用Image」を作り、その中で「db 起動 -> db schema migration -> servant-appのビルド」を行うという手法もあります。
docker multi stageビルドを使うと、「ビルド用Image」から成果物を取り出し、小さめな「ランタイム用Image」を作ることがシンプルにできます。
駒鳥(hxf_vogel)
ありがとうございます.
• docker networkを設定する
• --linkを使う(レガシー)
1つ目は今docker-compose.ymlに記述して回しているところで,2つ目はこれから調べてみます

docker multi stage buildは便利そうですね,イメージサイズが矢鱈と大きいのでビルドに成功してから取り組もうと考えていました.
https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/multistage-build/
この辺りから勉強し始めてみます:muscle:
ああー、すみません、ちゃんと読めてませんでした... :cold_sweat:
ソースコードはホスト側にあると思ってました...
駒鳥(hxf_vogel)
いえいえ!定型的な記述法がわからず回りくどい書き方をしてしまったと思いますので!