【发布时间】:2020-08-15 05:31:03
【问题描述】:
我正在使用来自 Dockerfile 的 go-redis 构建一个 golang:1.14.2 docker 容器。
FROM golang:1.14.2
# project setup and install go-redis
RUN mkdir -p /go/delivery && cd /go/delivery && \
go mod init example.com/delivery && \
go get github.com/go-redis/redis/v7
# important to copy to /go/delivery
COPY ./src /go/delivery
RUN ls -la /go/delivery
RUN go install example.com/delivery
ENTRYPOINT ["delivery"]
但是,当我尝试使用 docker-compose up --build -d 构建容器时,我收到此错误:$GOPATH/go.mod exists but should not
ERROR: Service 'delivery' failed to build: The command '/bin/sh -c go get github.com/go-redis/redis/v7' returned a non-zero code: 1。
但是,我可以使用来自 dockerfile docker container run -it --rm golang:1.14.2 的映像创建一个 docker 容器,然后运行与 Dockerfile 中完全相同的命令,delivery 会按照我的预期进行。
``
这里是deliver.go:
package main
import (
"fmt"
"github.com/go-redis/redis/v7"
)
func main() {
// redis client created here...
fmt.Println("inside main...")
}
我做错了什么?我查找了此错误消息,但我所见过的解决方案都没有为我工作。
编辑:这是撰写文件:
version: '3.4'
services:
...
delivery:
build: ./delivery
environment:
- REDIS_PORT=${REDIS_PORT}
- REDIS_PASS=${REDIS_PASS}
- QUEUE_NAME-${QUEUE_NAME}
volumes:
- ./logs:/logs
【问题讨论】:
-
听起来有些东西正在设置
GOPATH=/go/delivery,但它不应该是。它可能是该图像的默认值。 -
您也应该添加撰写文件,正如您所说的那样,问题可能就在那里,并且可能是因为您正在安装的某个目录。
-
同时运行
go install example.com/delivery不会使用本地资源,它将使用go install example.com/delivery发布的repo 中的资源。要使用您想要cd到项目的本地资源,只需运行go install,或者更好的是go build。 -
如果这是为了分发/运行应用程序而不仅仅是构建它,我会完全放弃它。 Go 应用程序是自包含的二进制文件,在运行时不需要工具链。用于运行程序的 Docker 容器应该只是一个基础容器,其中包含已编译的二进制文件。
-
@Adrian 执行复制的二进制文件的命令是否类似于
CMD ["/bin/bash", "<binary_name>"]?
标签: docker go dockerfile go-redis