目的
GoとReactの環境をdockerで作成
調べてみると、reactコンテナフォルダの中にReactプロジェクトフォルダが作成されて、そこにインストールされるという情報が多い。
しかし、プロジェクトフォルダが作成される場合、1階層深く潜らないといけないので、コンテナフォルダ直下にReactをインストールしたい。
Reactプロジェクト作成コマンド
npx create-react-app my-app
my-appというフォルダが作成される。
このフォルダを作成したくない。
※create-react-appは非推奨となっているそうです。
現在はフレームワークを利用してインストールすることが推奨されているようです。
※Reactはフレームワークではなく、JavaScriptライブラリー。
Reactフレームワーク
よく目にするのは、Next.js でしょうか。
npx create-next-app@latest
まずは失敗例
フォルダ構成
.
┣ go - goコンテナ
┃ ┗ Dockerfile
┣ react - Reactコンテナ
┃ ┗ Dockerfile
┗ docker-compose.yml
GO環境DockerFile
# 開発環境
FROM golang:1.21
WORKDIR /api
COPY . .
RUN go build main.go
React環境DockerFile
FROM node:20-alpine
ENV NODE_ENV=development
WORKDIR /usr/src/app
docker-compose.yml
version: '3'
services:
react-app:
container_name: react-app
build: ./react
volumes:
- ./react:/usr/src/app
command: sh -c "yarn start"
ports:
- 3000:3000
stdin_open: true
go:
container_name: go-api
build: ./go
volumes:
- ./go:/api
ports:
- 8888:8888
tty: true
コマンド
ビルド
docker-compose build
reactプロジェクトを作成
コンテナ直下にreactプロジェクトを作成する場合
docker-compose run --rm react-app sh -c 'npx create-react-app . --template typescript'
create-react-app の後に「.」を指定することでプロジェクトフォルダを作成せずに、コンテナ直下に作成できる。
失敗
% docker-compose run --rm react-app sh -c 'npx create-react-app . --template typescript'
[+] Building 0.0s (0/0) docker:desktop-linux
[+] Creating 1/0
✔ Network go_react_helloworld_default Created 0.0s
[+] Building 0.0s (0/0) docker:desktop-linux
Need to install the following packages:
create-react-app@5.0.1
Ok to proceed? (y) y
The directory . contains files that could conflict:
Dockerfile
Either try using a new directory name, or remove the files listed above.
どうやら、フォルダの中にファイルがあるとプロジェクトを作成できないらしい。
ということでフォルダ構成を変更してみる。
#成功例
フォルダ構成とdockerファイルの変更
.
┣ go - goコンテナ
┣ react - Reactコンテナ
┗ docker-compose.yml
┣ DockerfileGO
┗ DockerfileReact
DockerFileとdocker-compose.ymlを以下のように編集。
GO環境DockerFile
パス変更
# 開発環境
FROM golang:1.21
WORKDIR /api
COPY ./go/ /api/
#ENV GO111MODULE=auto
#RUN go get github.com/pilu/fresh
#CMD ["fresh"]
RUN go build main.go
React環境DockerFile
変更なし
FROM node:20-alpine
ENV NODE_ENV=development
WORKDIR /usr/src/app
docker-compose.yml
Dockerfileの指定
version: '3'
services:
react-app:
container_name: react-app
build:
context: .
dockerfile: DockerfileGo
volumes:
- ./react:/usr/src/app
command: sh -c "yarn start"
ports:
- 3000:3000
stdin_open: true
go:
container_name: go-api
build:
context: .
dockerfile: DockerfileReact
volumes:
- ./go:/api
ports:
- 8888:8888
tty: true
コマンド(二回目)
dockerコンテナビルド
docker-compose build
reactプロジェクトを作成
コンテナ直下にreactプロジェクトを作成する場合
docker-compose run --rm react-app sh -c 'npx create-react-app . --template typescript'
create-react-app の後に「.」を指定することでプロジェクトフォルダを作成せずに、コンテナ直下に作成できる。
フォルダ構成
.
┣ go - goコンテナ
┣ react - Reactコンテナ
┃ ┣ node_modules
┃ ┣ public
┃ ┣ src
┃ ┣ .gitignore
┃ ┣ package-lock.json
┃ ┗ package.json
┣ docker-compose.yml
┣ DockerfileGO
┗ DockerfileReact
Next.jsの場合
docker-compose.ymlの変更
commandの変更
version: '3'
services:
react-app:
container_name: react-app
build:
context: .
dockerfile: DockerfileGo
volumes:
- ./react:/usr/src/app
command: sh -c "yarn run dev"
ports:
- 3000:3000
stdin_open: true
go:
container_name: go-api
build:
context: .
dockerfile: DockerfileReact
volumes:
- ./go:/api
ports:
- 8888:8888
tty: true
インストールコマンド
docker-compose run --rm react-app sh -c 'npx create-next-app .'
インストール時に次の質問が表示されます。
? Would you like to use TypeScript? › No / Yes
このプロジェクトでTypeScriptを使いたいですか?
? Would you like to use ESLint? › No / Yes
このプロジェクトでESLintを使いたいですか?
? Would you like to use Tailwind CSS? › No / Yes
このプロジェクトでTailwind CSSを使いたいですか?
? Would you like to use `src/` directory? › No / Yes
このプロジェクトでsrc/ディレクトリを使いたいですか?
? Would you like to use App Router? (recommended) › No / Yes
App Routerを使いたいですか?(推奨)
Would you like to customize the default import alias?
デフォルトのインポートエイリアスをカスタマイズしたいですか?
フォルダ構成
.
┣ go - goコンテナ
┣ react - Reactコンテナ
┃ ┣ node_modules
┃ ┣ public
┃ ┣ src
┃ ┣ .eslintrc.json
┃ ┣ .gitignore
┃ ┣ next-env.d.ts
┃ ┣ next.config.mjs
┃ ┣ package-lock.json
┃ ┣ package.json
┃ ┣ postcss.config.js
┃ ┣ README.md
┃ ┣ tailwind.config.ts
┃ ┗ tsconfig.json
┣ docker-compose.yml
┣ DockerfileGO
┗ DockerfileReact
React/Next.JSの確認
http://localhost:3000/
にアクセス
Goの確認
goディレクトリ内にファイル作成
ファイル名 hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello World\n")
}
コマンドラインで実行
docker-compose run --rm go sh -c 'go run hello.go'
[+] Building 0.0s (0/0) docker:desktop-linux
[+] Building 0.0s (0/0) docker:desktop-linux
Hello World
無事、Hello Worldと表示された。