- 投稿日:2020-01-13T20:10:12+09:00
【docker-compose】Nuxt.jsとGOでREST APIを構築した手順
現在のプロジェクトでは、Nuxt.jsとGOをGKEを使ってREST APIを構築しています。
Kubernetesを利用する場合、Dockerを必然的に利用することになる上に、ローカルの環境構築も色々面倒だったため、
docker-compose
を利用することにしました。今回は、
Nuxt.js
とGO
でdocker-compose
を利用して、REST APIを構築したため、その手順をまとめています。docker-composeで構築したNuxt.jsとGOのREST APIの雑な全体像
表題の通り、めっちゃ雑なポンチ絵を作りました。
以上のようなデータの流れを再現するための手順をまとめます。
docker-composeでNuxt.jsとGOでREST APIを構築した手順の目次
ざっくりとした手順は以下です。
- ディレクトリ構成※
- Dockerfileを作成
- my.cnfを作成
- docker-compose.ymlを作成
- docker-compose upを実行
- アプリ側やコンテナ等の細かい設定変更
これから手順を詳細にまとめていきます。
※ディレクトリ構成は手順ではないですが目次には入れておきます。
ディレクトリ構成
※
Nuxt.js
とGO
でリポジトリが分かれている前提で手順を進めます。Nuxt.js側のディレクトリ構成
ディレクトリ構成も雑に最低限共有します。
project_name ├──app/ ├──nuxt.config.js ├──package.json ├──Dockerfile #本番用 ├──Dockerfile.dev └──docker-compose.yml※app/は作業しているファイルが格納されているディレクトリ(ディレクトリ構成については以下にまとめました。)
参考:https://qiita.com/arthur_foreign/items/637f2976e9f5e7a89727
GO側のディレクトリ構成
project_name ├──app/ │ ├──main.go │ └──database.go ├──config/ #tomlで見にいくDBを出し分け(現プロジェクトでは廃止予定ですが備忘録のため記載) │ ├──config_dev.toml │ ├──config_stg.toml │ ├──config_prd.toml │ └──config_docker.toml ├──db/ │ ├──migrations/ #マイグレーションファイル │ ├──mysql/ │ │ └──my.cnf # MySQLの設定ファイル │ └──seed/ #シードデータ ├──Dockerfile #本番用 ├──Dockerfile.dev └──docker-compose.yml※appは作業ディレクトリ
Dockerfileを作成
まずは、
Nuxt.js
とGO
のDockerfile
を作成しました。※本番環境とローカル環境で利用するDockerfileを分けるため、別名のDockerfileを用意しています。
※現プロジェクトのソースコードほぼコピペです。
Nuxt.js
Dockerfile.devFROM node:10.15.1-alpine as dev WORKDIR /app COPY . /app RUN apk update && \ apk add git RUN yarn CMD ["yarn", "dev"]GO
Dockerfile.devFROM golang:1.12-alpine as builder ADD . /go/src/github.com/project_name WORKDIR /go/src/github.com/project_name ENV GO111MODULE=on RUN apk update && \ apk add git && \ go get github.com/jmoiron/sqlx && \ GOOS=linux GOARCH=amd64 go build main.go FROM alpine:3.9 WORKDIR /app COPY --from=0 /go/src/github.com/project_name /app CMD ["./main"]multi-stage buildが出来るDockerfileの作成方法は、以下の記事に詳細をまとめましたので、参考にしていただけますと幸いです。
参考:https://qiita.com/arthur_foreign/items/fca369c1d9bde1701e38
my.cnfを作成
my.cnf[mysqld] character-set-server=utf8mb4 default_storage_engine=InnoDB log-error=/var/log/mysql/mysqld.log log_timestamps=SYSTEM slow_query_log=ON slow_query_log_file=/var/log/mysql/slow_query.log [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqldump] default-character-set=utf8mb4
my.cnf
についてはこの記事では触れません。以下の記事を参考にしました。
参考1:https://qiita.com/at_1016/items/874788e375938837a027
参考2:https://blog.apar.jp/linux/6769/
参考3:https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
参考4:https://qiita.com/EigenPort_M/items/46bd1bf386eb56eba97edocker-compose.ymlを作成
Nuxt.js
docker-compose.ymlversion: '3' services: front: build: context: . dockerfile: "Dockerfile.dev" volumes: - ./:/project_name/app ports: - "3000:3000" tty: true stdin_open: true networks: - project_name_default networks: project_name_default: external: trueGO
docker-compose.ymlversion: '3' services: api: build: context: . dockerfile: "Dockerfile.dev" volumes: - ./:/go/src/github.com/project_name ports: - "8080:8080" environment: - APP_ENV=docker depends_on: - db tty: true stdin_open: true networks: - project_name_default db: image: mysql:5.7 restart: always volumes: - ./db/mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: project_name MYSQL_USER: root ports: - "3306:3306" networks: project_name_default: external: true
networks
には、docker network ls
で出たネットワークを指定しました。(先にdocker-compose up
しています。)
docker-compose.yml
については、以下のドキュメントを参考にしました。参考1:https://qiita.com/sanoyo/items/294e76cbcb80df35a32f
参考2:https://qiita.com/at-946/items/08de3c9d7611f62b1894docker-compose upを実行
Nuxt.js
側とGO
側で以下のコマンドを実行しましょう。$ docker-compose up
docker-compose up --build
等のオプションは、以下のドキュメントが参考になりました。参考:http://docs.docker.jp/compose/reference/up.html
うまくいかない時はアプリやコンテナの設定を変えたり、DBにデータをつっこんだりしましょう。
アプリ側やコンテナ等の細かい設定変更
以下は、プロジェクトで僕がやった手順をまとめただけです。
- Nuxt.jsでリクエストするエンドポイントを指定
- GO側で見にいくDBを指定(toml管理)
- コンテナのlocale設定
※人によって手順が違うところもあると思うので、容赦無く読み飛ばしてもらえると嬉しいです。
Nuxt.jsでリクエストするエンドポイントを指定
エンドポイントの指定方法だけ書きます。
index.vue$axios.$get('http://api:8080')先ほど、
docker-compose.yml
に同じnetworks
をNuxt.js
側とGO
側に設定しています。
docker-compose.yml
に書いたAPI側のサービス名「api」を、エンドポイントのホスト名に指定することで、API側にリクエストを届けることが出来ました。また、エンドポイントのホスト名を
localhost
に指定すると、connect ECONNREFUSED 127.0.0.1:8080
のエラーが発生しました。GO側で見にいくDBを指定(toml管理)
docker-compose.yml
で設定した環境変数「APP_ENV=docker」によって、config_docker.toml
の設定を見にいくようにしています。見にいくDBをtomlで管理しました。
config_docker.toml[MySQL] Host = "db" Username = "root" Database = "project_name" Password = "password"database.goimport ( "os" "github.com/BurntSushi/toml" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var DB *sqlx.DB type Config struct { MySQL MySQLConfig } type MySQLConfig struct { Username string Password string Host string Database string } func init() { var config Config var configFilePath string basePath := os.Getenv("APP_PATH") env := os.Getenv("APP_ENV") switch env { case "production": configFilePath = basePath + "config/config_prd.toml" case "staging": configFilePath = basePath + "config/config_stg.toml" case "development": configFilePath = basePath + "config/config_dev.toml" case "test": configFilePath = basePath + "config/config_test.toml" case "docker": configFilePath = basePath + "config/config_docker.toml" default: configFilePath = basePath + "config/config_dev.toml" } _, err := toml.DecodeFile(configFilePath, &config) if err != nil { panic(err.Error()) } dbConfig := config.MySQL.Username + ":" + config.MySQL.Password + "@tcp(" + config.MySQL.Host + ":3306)/" + config.MySQL.Database + "?parseTime=true" db, err := sqlx.Connect("mysql", dbConfig) if err != nil { panic(err.Error()) } DB = db }コンテナのlocale設定
手順は以下の記事を参考にしました。
参考:https://qiita.com/maejima_f/items/4d5432aa471a9deaea7f
現プロジェクトでは中国語の繁体字を利用しているため、その設定をそのまま記事に書きます。
まず、MySQLのコンテナ名を出します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xxxxxxxxxxxx mysql:5.7 "docker-entrypoint.s…" 25 hours ago Up 12 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp project_name _db_1次に、Dockerコンテナの中のシェルに入りましょう。
$ docker exec -it project_name_db_1 bash中国語繁体字(
zh_TW
)のlocaleを追加します。$ apt-get update $ apt-get install locales locales-all $ dpkg-reconfigure locales $ export LANG=zh_TW.UTF-8追加されたlocaleを確認してみましょう。
$ locale LANG=zh_TW LANGUAGE= LC_CTYPE="zh_TW" LC_NUMERIC="zh_TW" LC_TIME="zh_TW" LC_COLLATE="zh_TW" LC_MONETARY="zh_TW" LC_MESSAGES="zh_TW" LC_PAPER="zh_TW" LC_NAME="zh_TW" LC_ADDRESS="zh_TW" LC_TELEPHONE="zh_TW" LC_MEASUREMENT="zh_TW" LC_IDENTIFICATION="zh_TW" LC_ALL=INSERT文で適当なクエリを投げてちゃんと入力できていたら完了です。
- 投稿日:2020-01-13T19:37:02+09:00
眺めて覚えるGo言語 その13 MongoDB
MongoDBにDatabaseを作りましょう。眺めていきます。
あらかじめMongoDB Copmpassをインストールしておきます。
main.gopackage main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) // アドレス帳の構造体 type Adr struct { ID int `bson:ID` Name string `bson:"名前"` Kana string `bson:"名前フリガナ"` Post string `bson:"郵便番号"` Address string `bson:"住所"` AddrKaba string `bson:"住所フリガナ"` Sex string `bson:"性別"` BloodType string `bson:"血液型"` Database string `bson:"生年月日"` Telphone string `bson:"電話番号"` Mobile string `bson:"携帯番号"` Mail string `bson:"メール"` } func main() { // Set client options clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") // Connect to MongoDB client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil {log.Fatal(err)} // Check the connection err = client.Ping(context.TODO(), nil) if err != nil {log.Fatal(err)} collection := client.Database("test").Collection("AdrList") // すべて消します collection.Drop(context.TODO()) fmt.Println("Connected to MongoDB!") adrs:=[]interface{}{ Adr {1,"関 波子","セキ ナミコ","135-0034","東京都江東区永代8-1-4","トウキョウトコウトウクエイタイ","女","AB","1980/07/31","03-3060-4716","090-7787-3784","sk@eaccess.net"}, Adr {2,"小倉 準司","コクラ ジュンジ","071-1544","北海道上川郡東神楽町14号6-13-1","ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ","男","A","1973/10/08","0166-36-3522","","junzi-kokura@eaccess.net"}, Adr {3,"西村 有紀子","ニシムラ ユキコ","635-0805","奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009","ナラケンキタカツラギグンコウリョウチョウカヤノ","女","O","1972/12/05","0745-67-2723","090-5165-2074","okikuy1972@livedoor.com"}, Adr {4,"谷 僧三郎","タニ ソウザブロウ","520-0011","滋賀県大津市南志賀2868","シガケンオオツシミナミシガ","男","B","1989/01/17","077-323-7124","090-3781-1181","suzbrutn@dsn.ad.jp"}, Adr {5,"山口 和久","ヤマグチ カズヒサ","012-0813","秋田県湯沢市前森1-11-7","アキタケンユザワシマエモリ","男","A","1973/02/21","0183-21-6828","070-4790-1232","kazuhisa73@geocities.com"}, Adr {6,"米田 一生","コメタ イッセイ","264-0029","千葉県千葉市若葉区桜木北4-13-4","チバケンチバシワカバクサクラギキタ","男","O","1984/07/25","043-883-8543","","issei07@dsn.ad.jp"}, Adr {7,"村松 希美江","ムラマツ キミエ","616-8151","京都府京都市右京区太秦帷子ヶ辻町6-6-7","キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ","女","O","1980/11/21","075-727-1789","090-4849-6939","kimie.muramatu@odn.ne.jp"}, Adr {8,"小野寺 眞八","オノデラ シンヤ","527-0135","滋賀県東近江市横溝町6-6-7","シガケンヒガシオウミシヨコミゾチョウ","男","O","1986/04/28","0748-01-7199","090-1457-0772","ondr.sny@gmo-media.jp"}, Adr {9,"志村 陽一郎","シムラ ヨウイチロウ","048-1321","北海道磯谷郡蘭越町湯里5-9-5 ル・メール湯里","ホッカイドウイソヤグンランコシチョウユノサト","男","O","1975/07/08","0136-88-6603","","smr-yutru@dion.ne.jp"}, Adr {10,"鎌田 敏美","カマタ トシミ","409-0115","山梨県上野原市松留4631","ヤマナシケンウエノハラシマツドメ","女","B","1993/06/09","0554-03-0156","090-5690-8749","kamata0609@example.com"}, Adr {11,"宮本 力弥","ミヤモト リキヤ","922-0325","石川県加賀市二子塚町8888","イシカワケンカガシフタゴヅカマチ","男","O","1975/08/10","07617-9-0761","070-6565-9470","rky75@example.ac.jp"}, Adr {12,"中山 英博","ナカヤマ ヒデヒロ","130-0024","東京都墨田区菊川1-11-7","トウキョウトスミダクキクカワ","男","A","1978/04/01","03-3043-4017","090-3086-6504","nkym0401@dion.ne.jp"}, Adr {13,"丸山 平作","マルヤマ ヘイサク","039-1557","青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315","アオモリケンサンノヘグンゴノヘマチハッケイ","男","AB","1994/05/26","0178-60-8503","070-3567-0574","hisk0526@ybb.ne.jp"}, Adr {14,"金子 君吉","カネコ キミキチ","959-1372","新潟県加茂市本町7-10-7 TOP・本町 5F","ニイガタケンカモシホンチョウ","男","O","1984/05/15","0256-13-9329","090-7210-7725","kaneko_kimikiti@aitai.ne.jp"}, Adr {15,"阿部 康伸","アベ ヤスノブ","071-0551","北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F","ホッカイドウソラチグンカミフラノチョウモトマチ","男","B","1973/04/09","0167-59-5860","090-6699-6888","abe-yasunobu@users.gr.jp"}, Adr {16,"東 健也","アズマ ケンヤ","933-0809","富山県高岡市出来田新町8732","トヤマケンタカオカシデキデンシンマチ","男","B","1977/12/25","0766-24-2308","","kenya.azuma@tiki.ne.jp"}, Adr {17,"高田 紀子","タカタ トシコ","654-0067","兵庫県神戸市須磨区離宮西町4-2-2","ヒョウゴケンコウベシスマクリキュウニシチョウ","女","B","1994/11/06","078-547-5651","070-8120-1066","okisotokisot@example.com"}, Adr {18,"金城 茂義","カネギ シゲヨシ","923-1266","石川県能美郡川北町下先出3-15-2","イシカワケンノミグンカワキタマチシモセンデン","男","O","1987/03/14","076-969-3546","070-8191-6845","sigeyosi2003@plala.or.jp"}, Adr {19,"神谷 覚","カミタニ サトル","614-8151","京都府八幡市上奈良小端4-13-5","キョウトフヤワタシカミナラオバタ","男","O","1976/02/04","075-435-9736","090-9981-6325","inatimak0204@hotmail.com"}, Adr {20,"北川 梨華","キタカワ リカ","171-0033","東京都豊島区高田3-10-1","トウキョウトトシマクタカダ","女","A","1980/12/25","03-3658-2663","090-1407-6777","akir1710033@yahoo.co.jp"}, } _,err = collection.InsertMany(context.TODO(), adrs) if err != nil {log.Fatal(err)} err = client.Disconnect(context.TODO()) if err != nil {log.Fatal(err)} fmt.Println("Connection to MongoDB closed.") }20件のデータが作成されます。
一覧表の出力
main.gopackage main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/bson" "strings" ) func main() { // Set client options clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") // Connect to MongoDB client, err := mongo.Connect(context.TODO(), clientOptions) defer client.Disconnect(context.TODO()) if err != nil {log.Fatal(err)} collection := client.Database("test").Collection("AdrList") findOptions := options.Find() f:=bson.D{} cur, err := collection.Find(context.TODO(), f, findOptions) if err != nil {log.Fatal(err)} lb:=strings.Split("id,名前,名前フリガナ,郵便番号,住所,住所フリガナ,性別,血液型,生年月日,電話番号,携帯番号,メール",",") for cur.Next(context.TODO()) { var a map[string]interface{} if err = cur.Decode(&a); err != nil {log.Fatal(err)} for i,l:=range lb{ if i==0 { fmt.Printf("%-16s\t%v\n",l,a[l]) } else{ fmt.Printf("%-16s\t%v\n",l,a[l]) } } fmt.Println("--------------------------------------------") } } 出力結果 >go run main.go id 1 名前 関 波子 名前フリガナ セキ ナミコ 郵便番号 135-0034 住所 東京都江東区永代8-1-4 住所フリガナ トウキョウトコウトウクエイタイ 性別 女 血液型 AB 生年月日 1980/07/31 電話番号 03-3060-4716 携帯番号 090-7787-3784 メール sk@eaccess.net -------------------------------------------- id 2 名前 小倉 準司 名前フリガナ コクラ ジュンジ 郵便番号 071-1544 住所 北海道上川郡東神楽町14号6-13-1 住所フリガナ ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ 性別 男 血液型 A 生年月日 1973/10/08 電話番号 0166-36-3522 携帯番号 メール junzi-kokura@eaccess.net -------------------------------------------- id 3 名前 西村 有紀子 名前フリガナ ニシムラ ユキコ 郵便番号 635-0805 住所 奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009 住所フリガナ ナラケンキタカツラギグンコウリョウチョウカヤノ 性別 女 血液型 O 生年月日 1972/12/05 電話番号 0745-67-2723 携帯番号 090-5165-2074 メール okikuy1972@livedoor.com -------------------------------------------- id 4 名前 谷 僧三郎 名前フリガナ タニ ソウザブロウ 郵便番号 520-0011 住所 滋賀県大津市南志賀2868 住所フリガナ シガケンオオツシミナミシガ 性別 男 血液型 B 生年月日 1989/01/17 電話番号 077-323-7124 携帯番号 090-3781-1181 メール suzbrutn@dsn.ad.jp -------------------------------------------- id 5 名前 山口 和久 名前フリガナ ヤマグチ カズヒサ 郵便番号 012-0813 住所 秋田県湯沢市前森1-11-7 住所フリガナ アキタケンユザワシマエモリ 性別 男 血液型 A 生年月日 1973/02/21 電話番号 0183-21-6828 携帯番号 070-4790-1232 メール kazuhisa73@geocities.com -------------------------------------------- id 6 名前 米田 一生 名前フリガナ コメタ イッセイ 郵便番号 264-0029 住所 千葉県千葉市若葉区桜木北4-13-4 住所フリガナ チバケンチバシワカバクサクラギキタ 性別 男 血液型 O 生年月日 1984/07/25 電話番号 043-883-8543 携帯番号 メール issei07@dsn.ad.jp -------------------------------------------- id 7 名前 村松 希美江 名前フリガナ ムラマツ キミエ 郵便番号 616-8151 住所 京都府京都市右京区太秦帷子ヶ辻町6-6-7 住所フリガナ キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ 性別 女 血液型 O 生年月日 1980/11/21 電話番号 075-727-1789 携帯番号 090-4849-6939 メール kimie.muramatu@odn.ne.jp -------------------------------------------- id 8 名前 小野寺 眞八 名前フリガナ オノデラ シンヤ 郵便番号 527-0135 住所 滋賀県東近江市横溝町6-6-7 住所フリガナ シガケンヒガシオウミシヨコミゾチョウ 性別 男 血液型 O 生年月日 1986/04/28 電話番号 0748-01-7199 携帯番号 090-1457-0772 メール ondr.sny@gmo-media.jp -------------------------------------------- id 9 名前 志村 陽一郎 名前フリガナ シムラ ヨウイチロウ 郵便番号 048-1321 住所 北海道磯谷郡蘭越町湯里5-9-5 ル・メール湯里 住所フリガナ ホッカイドウイソヤグンランコシチョウユノサト 性別 男 血液型 O 生年月日 1975/07/08 電話番号 0136-88-6603 携帯番号 メール smr-yutru@dion.ne.jp -------------------------------------------- id 10 名前 鎌田 敏美 名前フリガナ カマタ トシミ 郵便番号 409-0115 住所 山梨県上野原市松留4631 住所フリガナ ヤマナシケンウエノハラシマツドメ 性別 女 血液型 B 生年月日 1993/06/09 電話番号 0554-03-0156 携帯番号 090-5690-8749 メール kamata0609@example.com -------------------------------------------- id 11 名前 宮本 力弥 名前フリガナ ミヤモト リキヤ 郵便番号 922-0325 住所 石川県加賀市二子塚町8888 住所フリガナ イシカワケンカガシフタゴヅカマチ 性別 男 血液型 O 生年月日 1975/08/10 電話番号 07617-9-0761 携帯番号 070-6565-9470 メール rky75@example.ac.jp -------------------------------------------- id 12 名前 中山 英博 名前フリガナ ナカヤマ ヒデヒロ 郵便番号 130-0024 住所 東京都墨田区菊川1-11-7 住所フリガナ トウキョウトスミダクキクカワ 性別 男 血液型 A 生年月日 1978/04/01 電話番号 03-3043-4017 携帯番号 090-3086-6504 メール nkym0401@dion.ne.jp -------------------------------------------- id 13 名前 丸山 平作 名前フリガナ マルヤマ ヘイサク 郵便番号 039-1557 住所 青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315 住所フリガナ アオモリケンサンノヘグンゴノヘマチハッケイ 性別 男 血液型 AB 生年月日 1994/05/26 電話番号 0178-60-8503 携帯番号 070-3567-0574 メール hisk0526@ybb.ne.jp -------------------------------------------- id 14 名前 金子 君吉 名前フリガナ カネコ キミキチ 郵便番号 959-1372 住所 新潟県加茂市本町7-10-7 TOP・本町 5F 住所フリガナ ニイガタケンカモシホンチョウ 性別 男 血液型 O 生年月日 1984/05/15 電話番号 0256-13-9329 携帯番号 090-7210-7725 メール kaneko_kimikiti@aitai.ne.jp -------------------------------------------- id 15 名前 阿部 康伸 名前フリガナ アベ ヤスノブ 郵便番号 071-0551 住所 北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F 住所フリガナ ホッカイドウソラチグンカミフラノチョウモトマチ 性別 男 血液型 B 生年月日 1973/04/09 電話番号 0167-59-5860 携帯番号 090-6699-6888 メール abe-yasunobu@users.gr.jp -------------------------------------------- id 16 名前 東 健也 名前フリガナ アズマ ケンヤ 郵便番号 933-0809 住所 富山県高岡市出来田新町8732 住所フリガナ トヤマケンタカオカシデキデンシンマチ 性別 男 血液型 B 生年月日 1977/12/25 電話番号 0766-24-2308 携帯番号 メール kenya.azuma@tiki.ne.jp -------------------------------------------- id 17 名前 高田 紀子 名前フリガナ タカタ トシコ 郵便番号 654-0067 住所 兵庫県神戸市須磨区離宮西町4-2-2 住所フリガナ ヒョウゴケンコウベシスマクリキュウニシチョウ 性別 女 血液型 B 生年月日 1994/11/06 電話番号 078-547-5651 携帯番号 070-8120-1066 メール okisotokisot@example.com -------------------------------------------- id 18 名前 金城 茂義 名前フリガナ カネギ シゲヨシ 郵便番号 923-1266 住所 石川県能美郡川北町下先出3-15-2 住所フリガナ イシカワケンノミグンカワキタマチシモセンデン 性別 男 血液型 O 生年月日 1987/03/14 電話番号 076-969-3546 携帯番号 070-8191-6845 メール sigeyosi2003@plala.or.jp -------------------------------------------- id 19 名前 神谷 覚 名前フリガナ カミタニ サトル 郵便番号 614-8151 住所 京都府八幡市上奈良小端4-13-5 住所フリガナ キョウトフヤワタシカミナラオバタ 性別 男 血液型 O 生年月日 1976/02/04 電話番号 075-435-9736 携帯番号 090-9981-6325 メール inatimak0204@hotmail.com -------------------------------------------- id 20 名前 北川 梨華 名前フリガナ キタカワ リカ 郵便番号 171-0033 住所 東京都豊島区高田3-10-1 住所フリガナ トウキョウトトシマクタカダ 性別 女 血液型 A 生年月日 1980/12/25 電話番号 03-3658-2663 携帯番号 090-1407-6777 メール akir1710033@yahoo.co.jp -------------------------------------------- C:\Users\hirat\go\src\mongoex>go run m3.go id 1 名前 関 波子 名前フリガナ セキ ナミコ 郵便番号 135-0034 住所 東京都江東区永代8-1-4 住所フリガナ トウキョウトコウトウクエイタイ 性別 女 血液型 AB 生年月日 1980/07/31 電話番号 03-3060-4716 携帯番号 090-7787-3784 メール sk@eaccess.net -------------------------------------------- id 2 名前 小倉 準司 名前フリガナ コクラ ジュンジ 郵便番号 071-1544 住所 北海道上川郡東神楽町14号6-13-1 住所フリガナ ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ 性別 男 血液型 A 生年月日 1973/10/08 電話番号 0166-36-3522 携帯番号 メール junzi-kokura@eaccess.net -------------------------------------------- id 3 名前 西村 有紀子 名前フリガナ ニシムラ ユキコ 郵便番号 635-0805 住所 奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009 住所フリガナ ナラケンキタカツラギグンコウリョウチョウカヤノ 性別 女 血液型 O 生年月日 1972/12/05 電話番号 0745-67-2723 携帯番号 090-5165-2074 メール okikuy1972@livedoor.com -------------------------------------------- id 4 名前 谷 僧三郎 名前フリガナ タニ ソウザブロウ 郵便番号 520-0011 住所 滋賀県大津市南志賀2868 住所フリガナ シガケンオオツシミナミシガ 性別 男 血液型 B 生年月日 1989/01/17 電話番号 077-323-7124 携帯番号 090-3781-1181 メール suzbrutn@dsn.ad.jp -------------------------------------------- id 5 名前 山口 和久 名前フリガナ ヤマグチ カズヒサ 郵便番号 012-0813 住所 秋田県湯沢市前森1-11-7 住所フリガナ アキタケンユザワシマエモリ 性別 男 血液型 A 生年月日 1973/02/21 電話番号 0183-21-6828 携帯番号 070-4790-1232 メール kazuhisa73@geocities.com -------------------------------------------- id 6 名前 米田 一生 名前フリガナ コメタ イッセイ 郵便番号 264-0029 住所 千葉県千葉市若葉区桜木北4-13-4 住所フリガナ チバケンチバシワカバクサクラギキタ 性別 男 血液型 O 生年月日 1984/07/25 電話番号 043-883-8543 携帯番号 メール issei07@dsn.ad.jp -------------------------------------------- id 7 名前 村松 希美江 名前フリガナ ムラマツ キミエ 郵便番号 616-8151 住所 京都府京都市右京区太秦帷子ヶ辻町6-6-7 住所フリガナ キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ 性別 女 血液型 O 生年月日 1980/11/21 電話番号 075-727-1789 携帯番号 090-4849-6939 メール kimie.muramatu@odn.ne.jp -------------------------------------------- id 8 名前 小野寺 眞八 名前フリガナ オノデラ シンヤ 郵便番号 527-0135 住所 滋賀県東近江市横溝町6-6-7 住所フリガナ シガケンヒガシオウミシヨコミゾチョウ 性別 男 血液型 O 生年月日 1986/04/28 電話番号 0748-01-7199 携帯番号 090-1457-0772 メール ondr.sny@gmo-media.jp -------------------------------------------- id 9 名前 志村 陽一郎 名前フリガナ シムラ ヨウイチロウ 郵便番号 048-1321 住所 北海道磯谷郡蘭越町湯里5-9-5 ル・メール湯里 住所フリガナ ホッカイドウイソヤグンランコシチョウユノサト 性別 男 血液型 O 生年月日 1975/07/08 電話番号 0136-88-6603 携帯番号 メール smr-yutru@dion.ne.jp -------------------------------------------- id 10 名前 鎌田 敏美 名前フリガナ カマタ トシミ 郵便番号 409-0115 住所 山梨県上野原市松留4631 住所フリガナ ヤマナシケンウエノハラシマツドメ 性別 女 血液型 B 生年月日 1993/06/09 電話番号 0554-03-0156 携帯番号 090-5690-8749 メール kamata0609@example.com -------------------------------------------- id 11 名前 宮本 力弥 名前フリガナ ミヤモト リキヤ 郵便番号 922-0325 住所 石川県加賀市二子塚町8888 住所フリガナ イシカワケンカガシフタゴヅカマチ 性別 男 血液型 O 生年月日 1975/08/10 電話番号 07617-9-0761 携帯番号 070-6565-9470 メール rky75@example.ac.jp -------------------------------------------- id 12 名前 中山 英博 名前フリガナ ナカヤマ ヒデヒロ 郵便番号 130-0024 住所 東京都墨田区菊川1-11-7 住所フリガナ トウキョウトスミダクキクカワ 性別 男 血液型 A 生年月日 1978/04/01 電話番号 03-3043-4017 携帯番号 090-3086-6504 メール nkym0401@dion.ne.jp -------------------------------------------- id 13 名前 丸山 平作 名前フリガナ マルヤマ ヘイサク 郵便番号 039-1557 住所 青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315 住所フリガナ アオモリケンサンノヘグンゴノヘマチハッケイ 性別 男 血液型 AB 生年月日 1994/05/26 電話番号 0178-60-8503 携帯番号 070-3567-0574 メール hisk0526@ybb.ne.jp -------------------------------------------- id 14 名前 金子 君吉 名前フリガナ カネコ キミキチ 郵便番号 959-1372 住所 新潟県加茂市本町7-10-7 TOP・本町 5F 住所フリガナ ニイガタケンカモシホンチョウ 性別 男 血液型 O 生年月日 1984/05/15 電話番号 0256-13-9329 携帯番号 090-7210-7725 メール kaneko_kimikiti@aitai.ne.jp -------------------------------------------- id 15 名前 阿部 康伸 名前フリガナ アベ ヤスノブ 郵便番号 071-0551 住所 北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F 住所フリガナ ホッカイドウソラチグンカミフラノチョウモトマチ 性別 男 血液型 B 生年月日 1973/04/09 電話番号 0167-59-5860 携帯番号 090-6699-6888 メール abe-yasunobu@users.gr.jp -------------------------------------------- id 16 名前 東 健也 名前フリガナ アズマ ケンヤ 郵便番号 933-0809 住所 富山県高岡市出来田新町8732 住所フリガナ トヤマケンタカオカシデキデンシンマチ 性別 男 血液型 B 生年月日 1977/12/25 電話番号 0766-24-2308 携帯番号 メール kenya.azuma@tiki.ne.jp -------------------------------------------- id 17 名前 高田 紀子 名前フリガナ タカタ トシコ 郵便番号 654-0067 住所 兵庫県神戸市須磨区離宮西町4-2-2 住所フリガナ ヒョウゴケンコウベシスマクリキュウニシチョウ 性別 女 血液型 B 生年月日 1994/11/06 電話番号 078-547-5651 携帯番号 070-8120-1066 メール okisotokisot@example.com -------------------------------------------- id 18 名前 金城 茂義 名前フリガナ カネギ シゲヨシ 郵便番号 923-1266 住所 石川県能美郡川北町下先出3-15-2 住所フリガナ イシカワケンノミグンカワキタマチシモセンデン 性別 男 血液型 O 生年月日 1987/03/14 電話番号 076-969-3546 携帯番号 070-8191-6845 メール sigeyosi2003@plala.or.jp -------------------------------------------- id 19 名前 神谷 覚 名前フリガナ カミタニ サトル 郵便番号 614-8151 住所 京都府八幡市上奈良小端4-13-5 住所フリガナ キョウトフヤワタシカミナラオバタ 性別 男 血液型 O 生年月日 1976/02/04 電話番号 075-435-9736 携帯番号 090-9981-6325 メール inatimak0204@hotmail.com -------------------------------------------- id 20 名前 北川 梨華 名前フリガナ キタカワ リカ 郵便番号 171-0033 住所 東京都豊島区高田3-10-1 住所フリガナ トウキョウトトシマクタカダ 性別 女 血液型 A 生年月日 1980/12/25 電話番号 03-3658-2663 携帯番号 090-1407-6777 メール akir1710033@yahoo.co.jp -------------------------------------------- C:\Users\hirat\go\src\mongoex>go run m3.go id 1 名前 関 波子 名前フリガナ セキ ナミコ 郵便番号 135-0034 住所 東京都江東区永代8-1-4 住所フリガナ トウキョウトコウトウクエイタイ 性別 女 血液型 AB 生年月日 1980/07/31 電話番号 03-3060-4716 携帯番号 090-7787-3784 メール sk@eaccess.net -------------------------------------------- id 2 名前 小倉 準司 名前フリガナ コクラ ジュンジ 郵便番号 071-1544 住所 北海道上川郡東神楽町14号6-13-1 住所フリガナ ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ 性別 男 血液型 A 生年月日 1973/10/08 電話番号 0166-36-3522 携帯番号 メール junzi-kokura@eaccess.net -------------------------------------------- id 3 名前 西村 有紀子 名前フリガナ ニシムラ ユキコ 郵便番号 635-0805 住所 奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009 住所フリガナ ナラケンキタカツラギグンコウリョウチョウカヤノ 性別 女 血液型 O 生年月日 1972/12/05 電話番号 0745-67-2723 携帯番号 090-5165-2074 メール okikuy1972@livedoor.com -------------------------------------------- id 4 名前 谷 僧三郎 名前フリガナ タニ ソウザブロウ 郵便番号 520-0011 住所 滋賀県大津市南志賀2868 住所フリガナ シガケンオオツシミナミシガ 性別 男 血液型 B 生年月日 1989/01/17 電話番号 077-323-7124 携帯番号 090-3781-1181 メール suzbrutn@dsn.ad.jp -------------------------------------------- id 5 名前 山口 和久 名前フリガナ ヤマグチ カズヒサ 郵便番号 012-0813 住所 秋田県湯沢市前森1-11-7 住所フリガナ アキタケンユザワシマエモリ 性別 男 血液型 A 生年月日 1973/02/21 電話番号 0183-21-6828 携帯番号 070-4790-1232 メール kazuhisa73@geocities.com -------------------------------------------- id 6 名前 米田 一生 名前フリガナ コメタ イッセイ 郵便番号 264-0029 住所 千葉県千葉市若葉区桜木北4-13-4 住所フリガナ チバケンチバシワカバクサクラギキタ 性別 男 血液型 O 生年月日 1984/07/25 電話番号 043-883-8543 携帯番号 メール issei07@dsn.ad.jp -------------------------------------------- id 7 名前 村松 希美江 名前フリガナ ムラマツ キミエ 郵便番号 616-8151 住所 京都府京都市右京区太秦帷子ヶ辻町6-6-7 住所フリガナ キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ 性別 女 血液型 O 生年月日 1980/11/21 電話番号 075-727-1789 携帯番号 090-4849-6939 メール kimie.muramatu@odn.ne.jp -------------------------------------------- id 8 名前 小野寺 眞八 名前フリガナ オノデラ シンヤ 郵便番号 527-0135 住所 滋賀県東近江市横溝町6-6-7 住所フリガナ シガケンヒガシオウミシヨコミゾチョウ 性別 男 血液型 O 生年月日 1986/04/28 電話番号 0748-01-7199 携帯番号 090-1457-0772 メール ondr.sny@gmo-media.jp -------------------------------------------- id 9 名前 志村 陽一郎 名前フリガナ シムラ ヨウイチロウ 郵便番号 048-1321 住所 北海道磯谷郡蘭越町湯里5-9-5 ル・メール湯里 住所フリガナ ホッカイドウイソヤグンランコシチョウユノサト 性別 男 血液型 O 生年月日 1975/07/08 電話番号 0136-88-6603 携帯番号 メール smr-yutru@dion.ne.jp -------------------------------------------- id 10 名前 鎌田 敏美 名前フリガナ カマタ トシミ 郵便番号 409-0115 住所 山梨県上野原市松留4631 住所フリガナ ヤマナシケンウエノハラシマツドメ 性別 女 血液型 B 生年月日 1993/06/09 電話番号 0554-03-0156 携帯番号 090-5690-8749 メール kamata0609@example.com -------------------------------------------- id 11 名前 宮本 力弥 名前フリガナ ミヤモト リキヤ 郵便番号 922-0325 住所 石川県加賀市二子塚町8888 住所フリガナ イシカワケンカガシフタゴヅカマチ 性別 男 血液型 O 生年月日 1975/08/10 電話番号 07617-9-0761 携帯番号 070-6565-9470 メール rky75@example.ac.jp -------------------------------------------- id 12 名前 中山 英博 名前フリガナ ナカヤマ ヒデヒロ 郵便番号 130-0024 住所 東京都墨田区菊川1-11-7 住所フリガナ トウキョウトスミダクキクカワ 性別 男 血液型 A 生年月日 1978/04/01 電話番号 03-3043-4017 携帯番号 090-3086-6504 メール nkym0401@dion.ne.jp -------------------------------------------- id 13 名前 丸山 平作 名前フリガナ マルヤマ ヘイサク 郵便番号 039-1557 住所 青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315 住所フリガナ アオモリケンサンノヘグンゴノヘマチハッケイ 性別 男 血液型 AB 生年月日 1994/05/26 電話番号 0178-60-8503 携帯番号 070-3567-0574 メール hisk0526@ybb.ne.jp -------------------------------------------- id 14 名前 金子 君吉 名前フリガナ カネコ キミキチ 郵便番号 959-1372 住所 新潟県加茂市本町7-10-7 TOP・本町 5F 住所フリガナ ニイガタケンカモシホンチョウ 性別 男 血液型 O 生年月日 1984/05/15 電話番号 0256-13-9329 携帯番号 090-7210-7725 メール kaneko_kimikiti@aitai.ne.jp -------------------------------------------- id 15 名前 阿部 康伸 名前フリガナ アベ ヤスノブ 郵便番号 071-0551 住所 北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F 住所フリガナ ホッカイドウソラチグンカミフラノチョウモトマチ 性別 男 血液型 B 生年月日 1973/04/09 電話番号 0167-59-5860 携帯番号 090-6699-6888 メール abe-yasunobu@users.gr.jp -------------------------------------------- id 16 名前 東 健也 名前フリガナ アズマ ケンヤ 郵便番号 933-0809 住所 富山県高岡市出来田新町8732 住所フリガナ トヤマケンタカオカシデキデンシンマチ 性別 男 血液型 B 生年月日 1977/12/25 電話番号 0766-24-2308 携帯番号 メール kenya.azuma@tiki.ne.jp -------------------------------------------- id 17 名前 高田 紀子 名前フリガナ タカタ トシコ 郵便番号 654-0067 住所 兵庫県神戸市須磨区離宮西町4-2-2 住所フリガナ ヒョウゴケンコウベシスマクリキュウニシチョウ 性別 女 血液型 B 生年月日 1994/11/06 電話番号 078-547-5651 携帯番号 070-8120-1066 メール okisotokisot@example.com -------------------------------------------- id 18 名前 金城 茂義 名前フリガナ カネギ シゲヨシ 郵便番号 923-1266 住所 石川県能美郡川北町下先出3-15-2 住所フリガナ イシカワケンノミグンカワキタマチシモセンデン 性別 男 血液型 O 生年月日 1987/03/14 電話番号 076-969-3546 携帯番号 070-8191-6845 メール sigeyosi2003@plala.or.jp -------------------------------------------- id 19 名前 神谷 覚 名前フリガナ カミタニ サトル 郵便番号 614-8151 住所 京都府八幡市上奈良小端4-13-5 住所フリガナ キョウトフヤワタシカミナラオバタ 性別 男 血液型 O 生年月日 1976/02/04 電話番号 075-435-9736 携帯番号 090-9981-6325 メール inatimak0204@hotmail.com -------------------------------------------- id 20 名前 北川 梨華 名前フリガナ キタカワ リカ 郵便番号 171-0033 住所 東京都豊島区高田3-10-1 住所フリガナ トウキョウトトシマクタカダ 性別 女 血液型 A 生年月日 1980/12/25 電話番号 03-3658-2663 携帯番号 090-1407-6777 メール akir1710033@yahoo.co.jp --------------------------------------------ではフィルターをかけて女性だけを選んでみましょう
f:=bson.D{} ↓ f:= bson.D{{"性別", "女"}} 実行結果 >go run main.go id 1 名前 関 波子 名前フリガナ セキ ナミコ 郵便番号 135-0034 住所 東京都江東区永代8-1-4 住所フリガナ トウキョウトコウトウクエイタイ 性別 女 血液型 AB 生年月日 1980/07/31 電話番号 03-3060-4716 携帯番号 090-7787-3784 メール sk@eaccess.net -------------------------------------------- id 3 名前 西村 有紀子 名前フリガナ ニシムラ ユキコ 郵便番号 635-0805 住所 奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009 住所フリガナ ナラケンキタカツラギグンコウリョウチョウカヤノ 性別 女 血液型 O 生年月日 1972/12/05 電話番号 0745-67-2723 携帯番号 090-5165-2074 メール okikuy1972@livedoor.com -------------------------------------------- id 7 名前 村松 希美江 名前フリガナ ムラマツ キミエ 郵便番号 616-8151 住所 京都府京都市右京区太秦帷子ヶ辻町6-6-7 住所フリガナ キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ 性別 女 血液型 O 生年月日 1980/11/21 電話番号 075-727-1789 携帯番号 090-4849-6939 メール kimie.muramatu@odn.ne.jp -------------------------------------------- id 10 名前 鎌田 敏美 名前フリガナ カマタ トシミ 郵便番号 409-0115 住所 山梨県上野原市松留4631 住所フリガナ ヤマナシケンウエノハラシマツドメ 性別 女 血液型 B 生年月日 1993/06/09 電話番号 0554-03-0156 携帯番号 090-5690-8749 メール kamata0609@example.com -------------------------------------------- id 17 名前 高田 紀子 名前フリガナ タカタ トシコ 郵便番号 654-0067 住所 兵庫県神戸市須磨区離宮西町4-2-2 住所フリガナ ヒョウゴケンコウベシスマクリキュウニシチョウ 性別 女 血液型 B 生年月日 1994/11/06 電話番号 078-547-5651 携帯番号 070-8120-1066 メール okisotokisot@example.com -------------------------------------------- id 20 名前 北川 梨華 名前フリガナ キタカワ リカ 郵便番号 171-0033 住所 東京都豊島区高田3-10-1 住所フリガナ トウキョウトトシマクタカダ 性別 女 血液型 A 生年月日 1980/12/25 電話番号 03-3658-2663 携帯番号 090-1407-6777 メール akir1710033@yahoo.co.jp --------------------------------------------
- 投稿日:2020-01-13T18:32:48+09:00
Go言語でロックファイルを利用した多重起動防止サンプル
Go言語のバッチ等で、ロックファイルを利用した多重起動防止のサンプル実装です。
アプリケーションルートのディレクトリ配下の
/util
ディレクトリに置かれる想定で、~/go/src/
と/util/
を除いたディレクトリ名のハイフン区切りをロックファイル名にしています。ex.)
~/go/src/example/lockfile/util/lockfile.go
の場合
ロックファイルは~/go/src/example/lockfile/example-lockfile.lock
利用例
main.gopackage main import ( "lockfile/util" "os" ) func main() { os.Exit(execute()) } func execute() int { util.Setlock() defer util.Unlock() // do process return 0 }ソースコード
util/lockfile.gopackage util import ( "errors" "io/ioutil" "os" "path/filepath" "runtime" "strings" "sync" ) const separator string = string(filepath.Separator) const srcDir string = "src" + separator var lockfile string var once = new(sync.Once) // Setlock lock by creating lockfile func Setlock() (string, error) { once.Do(func() { lockfile = lockfilePath() }) return lockfile, lock(lockfile) } // Unlock unlock by removing lockfile func Unlock() error { if !exists(lockfile) { return errors.New("not running about: " + lockfile) } return os.Remove(lockfile) } func lockfilePath() string { _, filename, _, _ := runtime.Caller(0) rootDir := filepath.Dir(filename)[:strings.Index(filename, separator+"util")] packageName := rootDir[strings.Index(rootDir, srcDir)+len(srcDir):] lockfileName := strings.ReplaceAll(packageName, separator, "-") + ".lock" return filepath.Join(rootDir, lockfileName) } func exists(filepath string) bool { _, err := os.Stat(filepath) return !os.IsNotExist(err) } func lock(lockfile string) error { if exists(lockfile) { return errors.New("already running with: " + lockfile) } return ioutil.WriteFile(lockfile, []byte(""), 0644) }簡易テスト
util/lockfile_test.gopackage util import ( "io/ioutil" "os" "path/filepath" "runtime" "strings" "testing" ) func TestFilename(t *testing.T) { lockfilePath := lockfilePath() if filepath.Base(lockfilePath) != "lockfile.lock" { t.Errorf("lockfilePath() = %s; want basename=lockfile.lock", lockfilePath) } _, filename, _, _ := runtime.Caller(0) rootDir := filepath.Dir(filename)[:strings.Index(filename, "/util")] if filepath.Dir(lockfilePath) != rootDir { t.Errorf("lockfilePath() = %s; want dirpath=$GOPATH/src/path/to/lockfile", lockfilePath) } } func TestSetlock(t *testing.T) { if lockfilePath, err := Setlock(); err != nil { t.Errorf("cannot lock by creating lockfile: %s", lockfilePath) } _, err := Setlock() if err == nil { t.Errorf("error shoud occurs with existing lockfile") } os.Remove(lockfilePath()) } func TestUnlock(t *testing.T) { lockfilePath := lockfilePath() ioutil.WriteFile(lockfilePath, []byte(""), 0644) if err := Unlock(); err != nil { t.Errorf("cannot unlock by removing lockfile: %s", lockfilePath) } err := Unlock() if err == nil { t.Errorf("error shoud occurs with no lockfile") } }
- 投稿日:2020-01-13T15:10:12+09:00
Golang on DockerでEchoを動かす
TL;DR
Docker上でGolangのWebフレームワークであるEchoを動かしてみました。
DockerでGolang環境の構築
FROM golang:1.13.6-alpine WORKDIR /go/src COPY ./src /go/src RUN apk update && apk add git #RUN go get -u github.com/labstack/echo/...
dockerfile
内のgo get -u github.com/labstack/echo/...
が実行出来なかったのは何故だろう。。。docker-compose.ymlversion: '3' services: app: build: . ports: - 8080:8080 volumes: - ./src:/go/src tty: true$ mkdir srcsrc/server.gopackage main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, Echo World!!") }) e.Logger.Fatal(e.Start(":8080")) }$ docker-compose build $ docker-compose up -dEchoのインストール
https://echo.labstack.com/
https://echo.labstack.com/guide$ docker-compose exec app go get -u github.com/labstack/echo/... $ docker-compose exec app go run server.go ____ __ / __/___/ / ___ / _// __/ _ \/ _ \ /___/\__/_//_/\___/ v4.1.13 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\ ⇨ http server started on [::]:8080出来ました
本当はdocker-compose up -d
だけでEchoの実行までいきたいんですがね。。。
- 投稿日:2020-01-13T10:12:25+09:00
Go + gin-gonic + Vue で作るWebアプリの始め方
この記事では Goとgin-gonic (Go の Web Application Framework) および webpack と Vue を使ってWebアプリを作る際の初期環境の構築方法について説明します。自分自信、webpackやVueのプロではないので、もっといい方法などあればコメント歓迎です。なおこの工程でできる完成品は https://github.com/m-mizutani/web-app-go に置いてあります。
構築手順
webpack周りの設定
最初にyarnのパッケージを諸々追加します。
yarn init
するとパッケージの内容についていろいろ聞かれるのでよしなに入力します。$ yarn init $ yarn add -D @babel/cli @babel/core @babel/preset-env babel-loader webpack webpack-cli webpack-dev-server html-webpack-plugin vue-loader vue-template-compiler css-loader vue-style-loader sass-loader $ yarn add babel-polyfill vue node-sass axiosそのあと、
webpack.config.js
を作成します。スタイルシートにはSCSSを使うことを想定しています。./static
がデプロイ用ファイルの置き場、./src
が元のJavaScriptやスタイルシートを格納するディレクトリです。const path = require('path'); const VueLoaderPlugin = require("vue-loader/lib/plugin"); module.exports = { mode: "development", entry: ["babel-polyfill", path.resolve("src", "js", "index.js")], output: { filename: "bundle.js", path: path.join(__dirname, "static/js/"), publicPath: "/js" }, module: { rules: [ { test: /\.vue$/, loader: "vue-loader" }, { test: /\.js$/, loader: "babel-loader" }, { test: /\.s[ac]ss$/i, use: [ // Creates `style` nodes from JS strings 'vue-style-loader', // Translates CSS into CommonJS 'css-loader', // Compiles Sass to CSS 'sass-loader', ], } ] }, resolve: { extensions: [".js", "json", "jsx", "vue"], alias: { vue$: "vue/dist/vue.esm.js" } }, devServer: { contentBase: "static", proxy: { "/api": "http://localhost:9080" } }, plugins: [new VueLoaderPlugin()] };最後の方に書いてあるとおり、
/api/*
に対してはgoで書いたserverにproxyさせます。さらに、npm からコマンド実行できるように
package.json
に以下の項目を追加しておきます。"scripts": { "start": "webpack-dev-server", "build": "webpack --optimize-minimize" },Web関連のコードを追加
以下のファイルを初期ファイルとして配置します。 "This is test" というボタンをクリックするとAjaxでJSONをAPIサーバから取得して、その中の
message
という項目を表示するというシンプルなものです。
src/css/main.scss
src/js/index.js
src/js/app.vue
static/index.html
main.scss
body { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }index.js
import '../css/main.scss' import _ from 'lodash'; import "babel-polyfill"; import Vue from "vue"; import App from "./app.vue"; new Vue({ el: "#app", render: h => h(App) });app.vue
<template> <div> <div>MyApp</div> <button v-on:click="showMessage">This is test</button> <div>{{message}}</div> </div> </template> <script> import axios from "axios"; const appData = { message: "" }; export default { data() { return appData; }, methods: { showMessage: showMessage } }; function showMessage() { axios.get("/api/v1/hello").then(res => { console.log(res); appData.message = res.data.message; }); } </script> <style> </style>index.html
<!doctype html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>MyApp</title> </head> <body> <div id="app"></div> <script src="/js/bundle.js"></script> </body> </html>Goのサーバを書く
Goのモジュールを初期化します。パッケージ名は
github.com/m-mizutani/web-app-go
という想定ですので必要に応じて置き換えます。$ go mod init github.com/m-mizutani/web-app-go
そのあと
main.go
をレポジトリのトップディレクトリに作成します。package main import ( "fmt" "os" "github.com/gin-contrib/static" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) var logger = logrus.New() var logLevelMap = map[string]logrus.Level{ "trace": logrus.TraceLevel, "debug": logrus.DebugLevel, "info": logrus.InfoLevel, "warn": logrus.WarnLevel, "error": logrus.ErrorLevel, } type arguments struct { LogLevel string BindAddress string BindPort int StaticContents string } func runServer(args arguments) error { level, ok := logLevelMap[args.LogLevel] if !ok { return fmt.Errorf("Invalid log level: %s", args.LogLevel) } logger.SetLevel(level) logger.SetFormatter(&logrus.JSONFormatter{}) logger.WithFields(logrus.Fields{ "args": args, }).Info("Given options") r := gin.Default() r.Use(static.Serve("/", static.LocalFile(args.StaticContents, false))) r.GET("/api/v1/hello", func(c *gin.Context) { c.String(200, `{"message":"hello, hello, hello"}`) }) if err := r.Run(fmt.Sprintf("%s:%d", args.BindAddress, args.BindPort)); err != nil { return err } return nil } func main() { args := arguments{ LogLevel: "info", BindAddress: "0.0.0.0", BindPort: 9080, StaticContents: "./static", } if err := runServer(args); err != nil { logger.WithError(err).Fatal("Server exits with error") } }開発
Goサーバを動かす
go run .
でも起動しますが、開発のためにhot reloadができると便利なので
air を使います。.air.conf
という設定ファイルを用意します。以下サンプルです。[build] include_ext = ["go"] exclude_dir = ["src", "tmp", "node_modules"] delay = 1000 # ms stop_on_error = true log = "air_errors.log"ファイルを作成したら以下の通り実行します。
$ air -c .air.confWebpack dev server を動かす
こちらはデフォルトでホットリロードに対応してくれているので、そのまま
webpack-dev-server
を起動します。 package.json のscript
の項目を記述していれば、以下のコマンドで起動します。$ npm run startサーバが起動したら http://localhost:8080 を開くことで
デプロイ
Goのバイナリ +
./static
以下のファイルを対象サーバにコピーしたり、Docker image 化してpushしたりとすることで、デプロイできます。