はじめに

以下の書籍を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でコンテナ間で通信ができるようにします

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も変更していきます

DATABASE_URL="postgres://admin:admin@database:5432/todos"

次に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を変更します

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

おわりに

コンテナ間で通信を行うのを久しぶりにやったので備忘録を兼ねてまとめてみました

参考

 

广告
将在 10 秒后关闭
bannerAds