質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1837閲覧

[2019/08/24追記]golang moduleを用いてdockerを起動できません

jpskgc

総合スコア19

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2019/08/22 18:51

編集2019/08/24 12:04

前提・実現したいこと

golangを用いたapiをdockerで起動しようとしています。
packageを分割した際、go moduleを用いました。
コンパイルエラーは無いのですが、ローカルでgo run main.goを叩く、もしくはdocker-compose upを叩くとエラーが発生して起動できません。
正しいDocekrfiledocker-compose.ymlの記述を教えてください。

発生している問題・エラーメッセージ

docker-compose upを叩いた際のエラー

api_1 | build command-line-arguments: cannot load github.com/jpskgc/article/api/controller: cannot find module providing package github.com/jpskgc/article/api/controller article_api_1 exited with code 1

該当のソースコード

フォルダ構成
articleディレクトリでgo mod init articleを叩いています。

article ├ client ├ api │ ├ main.go │ ├ contoroller │ │ └ contoroller.go │ ├ //省略 │ └ Dockerfile ├ nginx ├ go.mod ├ go.sum └ docker-compose.yml

Dockerfile

1FROM golang:latest 2ENV GO111MODULE=on 3WORKDIR /go/src/github.com/jpskgc/article/app 4COPY . . 5RUN go mod download 6RUN go build 7RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build 8ENTRYPOINT ["/go/src/github.com/jpskgc/article/app/api"] 9

yml

1version: '3' 2services: 3 api: 4 build: 5 dockerfile: Dockerfile.dev 6 context: ./api 7 volumes: 8 - ./api:/go/src/github.com/jpskgc/article/app 9 depends_on: 10 - db 11 tty: true 12 environment: 13 - AWS_ACCESS_KEY_ID 14 - AWS_SECRET_ACCESS_KEY 15 - MYSQL_USER 16 - MYSQL_PASSWORD 17 - MYSQL_HOST 18 - GO111MODULE

【追記】
main.go

package main import ( "database/sql" "os" "time" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "github.com/joho/godotenv" "github.com/jpskgc/article/api/controller" ) func main() { api := router.Group("/api") { api.GET("/articles", func(c *gin.Context) { controller.GetArticleController(c, db) }) api.POST("/post/image", func(c *gin.Context) { controller.PostImageController(c) }) } router.Run(":2345") }

補足情報(FW/ツールのバージョンなど)

・client: react/axios ・api: golang/gin ・web-server: nginx ・db: mysql ・container: docker ・ci-tool: travis ・deploy: aws elastic beanstalk

以上、お手数ですがご教授いただけると幸いです。よろしくお願いいたします。

追記(2019/08/24)

ローカル環境でgo run main.goを叩くと正常に起動することは確認できました。
しかしdocker環境 でのdocker-compose upは相変わらず失敗します。(上記と同じエラーが出ます。)
全体のソースコードをgithubにあげさせていただきましたので、一度ご確認いただけると何より幸いです。
https://github.com/jpskgc/article/tree/try-golang-mod
(branch: try-golang-mod)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2019/08/23 04:33

main.goも貼ってください
jpskgc

2019/08/23 06:22

追加いたしました。よろしくお願いします。
nobonobo

2019/08/23 08:35

1. そのimport指定ならarticleディレクトリでgo mod init github.com/jpskgc/articleを叩く必要がありそう。(go.modは一旦削除して) 2. articleディレクトリごとdockerイメージにCOPYされる必要がありますのでDockerfileの場所はarticleフォルダに置く あと細かい調整はあるでしょうがまずはgo runで動くようにするのを頑張ってみてください。
nobonobo

2019/08/26 05:03

go runで動いたということはgo moduleの使い方としてはOKです。 あとはdocker側の問題です。イメージの中にgo.modが入っているのか、パスレイアウトが意図した状態になっているのか確認してみてください。
nobonobo

2019/08/27 01:06

「go mod init <命名>」とすることでgo.modが作成された「フォルダ」は「import "<命名>"」でimport可能になります。"フォルダ/controller"のパッケージは「import "<命名>/controller"」でimport可能です。 Dockerfileでイメージ内に「フォルダ」がCOPYされる必要があります。 あとはdocker側で帳尻合わせ出来ていない部分の修正だけです。 このあたりはご自身で試行錯誤しないと理解できないと思いますので 「これが答えです」を示すことは控えます。
jpskgc

2019/08/27 15:40

ご助言いただき誠にありがとうございます。おかげさまで解決まで至ることができました。
guest

回答2

0

ベストアンサー

Dockerfileのあるフォルダとgo.modファイルのあるフォルダをあわせてください。
質問の状況だと、docker内のgoからgo.modファイルが見えません。

go mod init の引数はパッケージルートの名前をつけます。
「go mod init article」とするとパッケージパスプレフィックスは「article」になり、
「go mod init github.com/hoge/article」とするとパッケージパスプレフィックスは「github.com/hoge/article」になります。

このあたりは実際のimport文に書いてるものと合わせる必要があります。

投稿2019/08/23 01:06

編集2019/08/23 05:56
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

    1. go mod init article/api を api ディレクトリで実行
article ├ client ├ api │ ├ main.go │ ├ contoroller │ │ └ contoroller.go │ ├ //省略 │ ├ go.mod │ ├ go.sum │ └ Dockerfile ├ nginx ├ go.mod ├ go.sum └ docker-compose.yml
    1. Docekrfileを以下のように書き換える

Docekrfile

1FROM golang:latest 2ENV GO111MODULE=on 3WORKDIR /app 4COPY go.mod . 5COPY go.sum . 6RUN go mod download 7COPY . . 8RUN go build 9RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build 10ENTRYPOINT ["/app/api"]
    1. docker-compose down -> docker-compose up --buildの順で叩く

以上の手順で解決いたしました。

投稿2019/08/27 15:38

編集2019/08/27 15:39
jpskgc

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問