英文:
Docker Dev Environment for GO
问题
我想做什么
我想为Go设置Docker开发环境。
代码
// 目录结构
项目(绝对路径: /Users/[用户名]/project)
|--- app
| |--- config
| | |___ config.go
| |--- main.go
| |___ config.ini
|--- docker-compose.yml
|___ Dockerfile
// main.go
package main
import (
"app/config"
"fmt"
)
func main() {
fmt.Println("Hello World")
fmt.Println(config.Config.ApiKey)
fmt.Println(config.Config.ApiSecrete)
}
// docker-compose.yml
version: '3.8'
services:
app:
build: .
tty: true
volumes:
- ./app:/go/src/app
// Dockerfile
FROM golang:latest
RUN mkdir /go/src/app
WORKDIR /go/src/app
ENV GO111MODULE=on
ENV GOPATH /go
ADD ./app /go/src/app/
开发环境
当我运行 docker-compose exec app go env
时,我得到以下输出:
GOPATH="/go"
GOROOT="/usr/local/go"
问题
当我运行 docker-compose up -d --build
时,我得到以下错误信息:package app/config is not in GOROOT (/usr/local/go/src/app/config)
。因此,我无法在 main.go
文件中导入 app/config
。
我想知道在使用Docker设置GO开发环境时如何导入自定义包。
英文:
What I want to do
I want to set up docker dev environment fo Go.
Code
// directory
project(absolute path: /Uses/[username]/project)
|--- app
| |--- config
| | |___ config.go
| |--- main.go
| |___ config.ini
|--- docker-compose.yml
|___ Dockerfile
// main.go
package main
import (
"app/config"
"fmt"
)
func main() {
fmt.Println("Hello World")
fmt.Println(config.Config.ApiKey)
fmt.Println(config.Config.ApiSecrete)
}
// docker-compose.yml
version: '3.8'
services:
app:
build: .
tty: true
volumes:
- ./app:/go/src/app
// Dockerfile
FROM golang:latest
RUN mkdir /go/src/app
WORKDIR /go/src/app
ENV GO111MODULE=on
ENV GOPATH /go
ADD ./app /go/src/app/
Dev Environment
When I run docker-compose exec app go env
, I get
GOPATH="/go"
GOROOT="/usr/local/go"
Problem
When I run docker-compose up -d --build
,
I get
package app/config is not in GOROOT (/usr/local/go/src/app/config)
.
So, I can't import "app/config"
in main.go
file.
I want to know how import self-made package when I set up GO dev environment with docker.
答案1
得分: 1
你可以参考go-env-series,了解如何使用Docker来定义你的Go开发环境的代码。例如:chris-crone/containerized-go-dev
第二篇文章提到了go mod init
,它有助于处理导入路径:
通过使用
go mod init
,让当前目录成为一个模块的根目录:$ go mod init example.com/hello go: creating new go.mod: module example.com/hello
go.mod
文件只会出现在模块的根目录中。子目录中的包的导入路径由模块路径加上子目录的路径组成。
例如,如果我们创建了一个名为world的子目录,我们不需要(也不应该)在那里运行
go mod init
。该包会自动被识别为example.com/hello
模块的一部分,其导入路径为example.com/hello/world
。
英文:
You can follow the go-env-series about how to use Docker to define your Go development environment in code.
Example: chris-crone/containerized-go-dev
The second article does mention go mod init
, which helps with import path:
> Let’s make the current directory the root of a module by using go mod init
:
>
> $ go mod init example.com/hello
> go: creating new go.mod: module example.com/hello
>
> The go.mod
file only appears in the root of the module.
>
> Packages in subdirectories have import paths consisting of the module path plus the path to the subdirectory.
>
> For example, if we created a subdirectory world, we would not need to (nor want to) run go mod init
there.
The package would automatically be recognized as part of the example.com/hello
module, with import path example.com/hello/world
.
答案2
得分: 1
感谢你,我已经解决了这个问题,所以我会分享给你。
我运行了 go mod init app
和 go mod tidy
。
然后,我修改了 Dockerfile,将 GO111MODULE=on
设置为环境变量。
version: '3.8'
services:
app:
build: .
tty: true
volumes:
- ./app:/go/src/app
environment:
- "GO111MODULE=on"
// 目录结构
project(绝对路径: /Uses/[username]/project)
|--- app
| |--- config
| | |___ config.go
| |--- main.go
| |--- config.ini
| |--- go.mod
| |___ go.sum
|--- docker-compose.yml
|___ Dockerfile
英文:
Thanks to you, I've solved this problem, so I'll share.
I run go mod init app
, and go mod tidy
.
Then, I change Dockerfile to set GO111MODULE=on
.
version: '3.8'
services:
app:
build: .
tty: true
volumes:
- ./app:/go/src/app
environment:
- "GO111MODULE=on"
// directory
project(absolute path: /Uses/[username]/project)
|--- app
| |--- config
| | |___ config.go
| |--- main.go
| |--- config.ini
| |--- go.mod
| |___ go.sum
|--- docker-compose.yml
|___ Dockerfile
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论