はじめに
以下の書籍をRustのコンテナ上で実行したところDatabase接続につまづいたのでまとめます
問題
書籍の設定をしたところRustコンテナからpostgresql
に接続ができませんでした
$ make dev
error: error communicating with database: Connection refused (os error 111)
make: *** [Makefile:6: dev] Error 1
sqlx create db
で落ちていました
設定方法
まずはdocker-compose.yml
でコンテナ間で通信ができるようにします
docker-compose.yml
version: '3'
services:
rust:
build: .
container_name: rust
tty: true
ports:
- "3000:3000"
volumes:
- .:/app
env_file:
- .env
networks:
- app-net
database:
build:
context: ./database
dockerfile: Dockerfile
target: 'database'
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: admin
POSTGRES_USER: admin
POSTGRES_DB: todosnetworkName
TZ: Asia/Tokyo
restart: always
networks:
- app-net
volumes:
pgdata:
networks:
app-net:
driver: bridge
ポイントはbrige
を行うことです
これをすることでRustからdatabase
という名前でアクセスしていきます(localhostのような感じで)
次に.env
のURLも変更していきます
.env
DATABASE_URL="postgres://admin:admin@database:5432/todos"
次にMakefile
も修正します
Makefile
dev:
sqlx db create
sqlx migrate run
cd my-todo && cargo watch -x run
make dev
を実行したときにmigrate
までしたらmy-todo
に移動してcargo run
を実行します。これはCargo.toml
が/my-todo
にあるので、実行場所を変えています
次にcargo watch
を利用するためにrustのDockerfile
を変更します
Dockerfile
FROM rust:alpine3.17
RUN apk update && apk add git alpine-sdk make libffi-dev openssl-dev pkgconfig
RUN rustup component add rls rust-analysis rustfmt clippy
RUN cargo install sqlx-cli cargo-watch
WORKDIR /app/my-todo
cargo-watch
をインストールしました
最終的には以下のディレクトリ構成になりました
├ database
└ Dockerfile (DB用のDockerfile)
├ migrations
└ timestamp_init.sql
├ my-todo
└ src
└ Cargo.toml
└ Cargo.lock
├ .env
├ docker-compose.yml
├ Dockerfile (Rust用のDockerfile)
├ Makefile
おわりに
コンテナ間で通信を行うのを久しぶりにやったので備忘録を兼ねてまとめてみました
参考