7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

分析屋が異世界転生してエンジニアになったAdvent Calendar 2022

Day 17

DockerでGo+React+TypeScript+Chakra-UI+MySQLの環境をつくる

Last updated at Posted at 2022-12-16

はじめに

業務でタイトルの環境を作ることが多くなってきたことと、今後教える際に楽をするためにまとめてみます。
以前にDockerでGo+MySQLの環境をつくる記事を出しているので、こちらと重複している部分があります

ディレクトリ構成

sample-project
┣ docker
┃   ┣ go
┃   ┃ ┗ Dockerfile
┃   ┣ reactapp
┃    ┗ Dockerfile
┣ .env
┣ docker-compose.yml
┣ my.cnf

ファイル作成

# docker/go/Dockerfile

FROM golang:1.18.0
RUN apt-get update && apt-get install -y build-essential make

# vscodeの拡張機能のためにインストール
RUN go install golang.org/x/tools/gopls@latest
RUN go install github.com/ramya-rao-a/go-outline@latest
RUN go install github.com/cosmtrek/air@latest
// RUN wget -O ~/vsls-reqs https://aka.ms/vsls-linux-prereq-script && chmod +x ~/vsls-reqs && ~/vsls-reqs

WORKDIR /go/src
# docker/reactapp/Dockerfile

FROM node

RUN apt-get update
.env
ROOTUSER=root
ROOTPASS=password
DATABASE=sampledb
USERNAME=docker
USERPASS=docker
docker-compose.yml
services:
  app:
    build: ./docker/reactapp
    container_name: reactapp
    tty: true
    working_dir: /usr/src/app
    volumes:
      - ./reactapp:/usr/src/app
    command: sh -c "yarn start"
    ports:
      - "3000:3000"

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_USER: ${ROOTUSER}
      MYSQL_ROOT_PASSWORD: ${ROOTPASS}
      MYSQL_DATABASE: ${DATABASE}
      MYSQL_USER: ${USERNAME}
      MYSQL_PASSWORD: ${USERPASS}
      TZ: "Asia/Tokyo"
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    env_file:
      - .env
    container_name: db
    ports:
      - 3306:3306

  go:
    build: ./docker/go
    volumes:
      - ./go/src:/go/src
    container_name: go
    tty: true
    ports:
      - "8000:8000"
    depends_on:
      - db

my.cnf
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8

Docker準備

Dockerイメージの作成を行います
コンテナの起動は後述のreactappプロジェクトを作成してからになります

$ docker-compose build

React

// reactappは作成したいプロジェクト名
$ npx create-react-app --template typescript reactapp

コンテナを起動します

$ docker-compose up

localhost:3000にアクセスして以下の画面が表示されていればOKです

image.png

Chakra-UI

// package.jsonのあるディレクトリでインストール
$ cd reactapp
$ yarn add @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^10

※2023/6/20 追記
chakraのモーダルコンポーネントを利用する際はframer-motionのバージョンに注意が必要です。バージョンが4系だとモーダルが再表示されなくなりました。追記時点では6系や10系で正しく動作することを確認できています。その他のバージョンについては確認していません。

chakra-uiのインストールが完了したら忘れずにindex.tsxのAppタグをChakraProviderタグで囲みます

index.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { ChakraProvider } from "@chakra-ui/react";

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);
root.render(
  <React.StrictMode>
    <ChakraProvider>
      <App />
    </ChakraProvider>
  </React.StrictMode>
);

reportWebVitals();

次にApp.tsxのreturnの中身をchakra-uiのbuttunコンポーネントに変更し、chakra-uiが適用されるか確認します

App.tsx
import React from "react";
import "./App.css";
import { Button } from "@chakra-ui/button";

function App() {
  return <Button colorScheme="blue">Button</Button>;
}

export default App;

localhost:3000にアクセスして以下の画面になっていればOKです

image.png

MySQL

dbのコンテナに入り、mysqlに接続できることを確認します

$ docker exec -it db sh
// passwordはpassword(.envのROOTPASS)
$ mysql -u root -p

image.png

Go

goのコンテナに入ります

$ docker exec -it go sh

go/srcに移動してgo.modを作成します

// sample_goというモジュール名で作成
# go mod init sample_go

go/srcで以下内容のmain.goを作成します

main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

以下を実行し、コンソール上にHello, World!が表示されたらOKです

# go run main.go

おわりに

長くなってしまいましたが、これで同じようなことを調べる必要がなくなればと思います。

7
5
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
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?