docker - 当我将 go 与 docker compose 一起使用时出现“没有 Go 文件...”错误
问题描述
我在 Ubuntu 16.04 上安装了 Go。这是我的 GOPATH=/home/{username}/work。
我在 /home/{username}/work/src 中创建了一个项目。
这是我的项目文件夹层次结构。
project-name
services
configuration
api
main.go
Dockerfile
bff
api
main.go
Dockerfile
docker-compose.yml
favicon.ico
README.md
我可以使用我的 dockerfile 构建和运行,但我无法使用 docker-compose 构建和运行。
我找不到任何解决方案。
配置服务dockerfile:
FROM golang:1.11.1-alpine3.8 as builder
RUN apk update && apk add git && go get gopkg.in/natefinch/lumberjack.v2
RUN mkdir -p /go/src/project-name/services/configuration
RUN CGO_ENABLED=0
RUN GOOS=linux
ADD . /go/src/project-name/services/configuration
ENV GOPATH /go
WORKDIR /go/src/project-name/services/configuration/api
RUN go get
RUN go build
FROM alpine
RUN apk update
RUN apk add curl
RUN mkdir -p /app
COPY --from=builder /go/src/project-name/services/configuration/api/ /app/
RUN chmod +x /app/api
WORKDIR /app
EXPOSE 5001
ENTRYPOINT ["/app/api"]
它适用于 dockerfile。
这是我的 docker-compose 文件:
version: '3.4'
services:
bff:
image: project-name/bff:${TAG:-latest}
build:
context: .
dockerfile: services/bff/Dockerfile
ports:
- "5000:5000"
container_name: bff
depends_on:
- configuration
configuration:
image: project-name/configuration:${TAG:-latest}
build:
context: .
dockerfile: services/configuration/Dockerfile
ports:
- "5001:5001"
container_name: configuration
它没有用。
“run go get”命令运行时报错,错误为:
can't load package: package project-name/services/configuration/api: no Go files in /go/src/project-name/services/configuration/api
ERROR: Service 'configuration' failed to build: The command '/bin/sh -c go get' returned a non-zero code: 1
解决方案
在你的 Dockerfile 中,你说
ADD . /go/src/project-name/services/configuration
它期望主机上的构建上下文目录包含源文件。但是你的docker-compose.yml
文件说
build:
context: .
dockerfile: services/configuration/Dockerfile
其中上下文目录是源代码控制树的根目录,而不是您尝试构建的特定 Go 源代码目录。如果您将其更改为
build:
context: services/configuration
# Default value of "dockerfile: Dockerfile" will be right
它可能会更好。
在普通的 Docker 命令中,您当前docker-compose.yml
的文件相当于
cd $GOPATH/src/project-name
docker build -f services/configuration/Dockerfile .
但你可能实际上正在运行
cd $GOPATH/src/project-name/services/configuration
docker build .
什么目录是当前目录很重要。
推荐阅读
- python - 为什么当我将帖子发送到我的服务器时字符串更改为 %
- r - 如何根据 is.na() 一次加入多个列并匹配条件?
- firebase - React 本机博览会中的 Firebase 电话号码身份验证,不适用于 Android 设备
- swiftui - 列表实例化 NavigationLink 两次,重新初始化 State vars
- php - PHP-Laravel 从 /index.php 重定向到 root(/)
- python - 无法将容器与网络中的数据库和应用程序连接起来
- html - 引导模式中的表格不适合且不显示溢出
- angular - NgRx Selectors 和 Reducers 是如何纯函数的?
- security - 放大:如何在连接上使用父母的访问权限?
- python - 如何从模块中导入以某个前缀开头的名称?