docker - GO / Golang 在 Docker 问题上运行项目 - 找不到包(内部文件夹)
问题描述
我正在尝试在 Docker 上运行我的第一个 Golang 项目。虽然我成功完成了一个简单的“hello world”应用程序,但我在一个稍微结构化的项目中遇到了一些困难。
该项目有一些文件夹,我在 main.go 文件中导入了这些文件夹。当我尝试在 Docker 上运行我的解决方案时,它在加载这些“包”时卡住了。
这是我的 Dockerfile
FROM golang:1.17-alpine
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go env GOROOT
RUN go build -o /my-api
EXPOSE 8080
CMD [ "/my-api" ]
这是我得到的错误
Step 8/10 : RUN go build -o /my-api
---> Running in c1c9d1058caa
main.go:10:2: package my-api/Repositories is not in GOROOT (/usr/local/go/src/my-api/Repositories)
main.go:11:2: package my-api/Settings is not in GOROOT (/usr/local/go/src/my-api/Settings)
我注意到的一件事是这条路
/usr/local/go/src/my-api/Settings
应该
/usr/local/gocode/src/my-api/Settings
在我的本地机器上
这是我的项目结构的一瞥
有任何想法吗?
解决方案
为什么不使用像这样的 Dockerfile:
FROM golang:1.17-alpine
RUN apk add build-base
WORKDIR /app
ADD . /app
RUN go build -o /my-api
EXPOSE 8080
CMD [ "/my-api" ]
这会将本地计算机上本地目录的内容复制到/app
映像中。
注意:要构建“生产级”图像,我会使用多阶段构建:
FROM golang:1.17-alpine as builder
RUN apk add build-base
WORKDIR /app
ADD . /app
RUN go build -o /my-api
FROM alpine:3.14
COPY --from=builder /my-api /
EXPOSE 8080
CMD [ "/my-api" ]
推荐阅读
- go - 如何解压单个文件?
- regex - 需要删除删除正则表达式中的模式/字符串(记事本++)
- opencl - clGetKernelWorkGroupInfo CL_KERNEL_WORK_GROUP_SIZE 返回值含义
- java - jenkins 与 maven 问题的集成
- http - OPLON LBL ADC:是否可以使用单个虚拟域来管理所有子域的所有传入请求?
- javascript - 在 jsx 对象内插入 html 标签以进行映射
- java - 使用存储在数据库中的 ViewFlipper 滑动图像
- visual-studio - 无法通过 Visual Studio 2019 和 TFS 2018 的流程模板编辑器添加转换链接
- java - Java 处理程序如何在不发送 onUserInteraction 方法的情况下执行意图
- apostrophe-cms - 在撇号页面中显示撇号小部件