はじめに
業務でタイトルの環境を作ることが多くなってきたことと、今後教える際に楽をするためにまとめてみます。
以前に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
ROOTUSER=root
ROOTPASS=password
DATABASE=sampledb
USERNAME=docker
USERPASS=docker
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
[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です
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タグで囲みます
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が適用されるか確認します
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です
MySQL
dbのコンテナに入り、mysqlに接続できることを確認します
$ docker exec -it db sh
// passwordはpassword(.envのROOTPASS)
$ mysql -u root -p
Go
goのコンテナに入ります
$ docker exec -it go sh
go/srcに移動してgo.modを作成します
// sample_goというモジュール名で作成
# go mod init sample_go
go/srcで以下内容のmain.goを作成します
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
以下を実行し、コンソール上にHello, World!が表示されたらOKです
# go run main.go
おわりに
長くなってしまいましたが、これで同じようなことを調べる必要がなくなればと思います。