3
2

More than 1 year has passed since last update.

Docker x Golang x PostgreSQL で環境構築

Last updated at Posted at 2023-01-03

概要

現場でGo言語の使用する予定があるのでDockerを使用して環境構築をしてみました。
ディレクトリ構成などはブログ記事など参考にしました。
(書籍なども読んでいってデファクトを見つけていきます。)

ソースコードだけ見たいという方はこちらから見ることができます。

環境

  • go 19.1
  • PostgreSQL 15.1
  • macOS Monterey version12.6

対象読者

  • docker x Go x PostgreSQL の環境で簡単に動かしてみたい方
  • dockerでの環境構築を試そうとされている方

目次

ディレクトリ構成

.
├── app
│      ├── database
│      │   └── init
│   │      └── init_database.sql
│   ├── .env
│      └── main.go
├── build
│   └── dockerfiles
│        ├── app
│        │    └── Dockerfile
│        └── postgresql
│             └── Dockerfile
├── .env
├── .env.example
├── .gitignore
├── docker-compose.yml
└── README.md

Docker

以下のファイルを用意し cmd に進んでください。

  • docker-compose.yml
docker-compose.yml
version: '3.8'

services:
  # golang
  app:
    container_name: ${APP_CONTAINER_NAME}
    build: # ビルドに使うDockerファイルのパス
      context: .
      dockerfile: ./build/dockerfiles/app/Dockerfile
    volumes: # マウント
      - ./app:/usr/local/go/src/sample_app/app
      - .env:/usr/local/go/src/sample_app/app/.env
    tty: true # コンテナの永続化
    depends_on:
      - db
    ports:
      - ${APP_PORT}:3000
  # posttgresql
  db:
    container_name: ${DB_HOST}
    build:
      context: .
      dockerfile: ./build/dockerfiles/postgresql/Dockerfile
    environment:
      - POSTGRES_DB=${DB_DATABASE}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    volumes:
      - db-store:/var/lib/postgresql/data
      - ./app/database/init:/docker-entrypoint-initdb.d # DBを初期化
    ports:
      - ${DB_PORT}:5432

volumes:
  db-store:

  • Dockerfile(Go)
build/dockerfiles/app/Dockerfile
FROM golang:1.19.1-alpine

RUN mkdir -p /usr/local/go/src/sample_app/app

WORKDIR /usr/local/go/src/sample_app/app

RUN apk update && apk add git
  • Dockerfile(PostgreSQL)
build/dockerfiles/postgresql/Dockerfile
FROM postgres:15.1

RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
  • database

database初期化

ここでは、sample_app というデータベース名でデータベースの作成をするようにしています。

database/init/init_database.sql
CREATE DATABASE IF NOT EXISTS sample_app;
  • .env

.env.example の内容を .env にコピーし使用してください。
あくまで sample なのでお好きな設定でご使用ください。

.env
# DBコンテナ名
DB_HOST=sample_app_postgresql

# init時のdatabase
DB_DATABASE=sample_app

# DB情報
DB_USER=postgres
DB_PASSWORD=postgres
DB_PORT=5432

# app コンテナ
APP_CONTAINER_NAME=sample_app_backend
APP_PORT=30000

cmd

  • build してコンテナ起動
bash
docker-compose up -d --build
  • app コンテナにアクセス
bash
docker-compose exec app sh
  • db コンテナにアクセス
bash
docker-compose exec db bash

sample プログラム

main.go にサンプルでプログラミングし、きちんと動作するかテスト

  • main.go
main.go
package main

import "fmt"

func main() {
	fmt.Println("Testing")
}

  • Testing

fmt で標準出力ができるか確認

bash
$ docker-compose exec app sh                                                                                                                                                 
[↓コンテナ内]
/usr/local/go/src/sample_app/app # ls -la
total 12
drwxr-xr-x    5 root     root           160 Jan  2 08:26 .
drwxr-xr-x    3 root     root          4096 Jan  2 08:30 ..
-rw-r--r--    1 root     root           210 Jan  2 08:33 .env
drwxr-xr-x    3 root     root            96 Jan  2 08:27 database
-rw-r--r--    1 root     root            68 Jan  2 08:29 main.go
/usr/local/go/src/sample_app/app # go run main.go
Testing

まとめ

DockerでのGo x PostgreSQLの環境構築もGoの扱いもほぼ初めてなので至らない点などあるかと思います。
そのときは、ご教授いただけますと幸いです。

また、発見などありましたら記事にしていきたいと思いますのでよろしくお願いします。

最後まで読んでいただきありがとうございました!

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2