linux - docker : 'go.mod: permission denied' on go commands

标签 linux docker go

我有一个错误

go: open /go/src/dummy/go.mod: permission denied

当我尝试执行任何 执行命令 在 Docker 中(去获取、去列表等)

操作系统:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic

docker :
$ docker -v
Docker version 19.03.6, build 369ce74a3c

图片:golang:1.13.3-alpine3.10

为了说明这一点,我创建了一个虚拟项目

main.go:
package main

import (
    "fmt"
)

func main() {
    fmt.Print("this file is not important for question")
}

Dockerfile:
FROM golang:1.13.3-alpine3.10 as builder
WORKDIR /go/src/dummy
COPY . .
RUN go list
CMD tail -f /dev/null

和空文件 go.mod 和 go.sum,所以现在项目目录是:
$ ls -l
-rw-r--r-- 1 curuser curuser 139 may 23 15:03 Dockerfile
-rw-r--r-- 1 curuser curuser  22 may 23 15:03 go.mod
-rw-r--r-- 1 curuser curuser   0 may 23 14:48 go.sum
-rw-r--r-- 1 curuser curuser  86 may 23 14:50 main.go

构建图像,我得到:
$ docker build -t dummy ~/go/src/dummy
Sending build context to Docker daemon  4.608kB
Step 1/5 : FROM golang:1.13.3-alpine3.10 as builder
 ---> f23ef2e47d30
Step 2/5 : WORKDIR /go/src/dummy
 ---> Running in 0e276917d658
Removing intermediate container 0e276917d658
 ---> e9e910dd0ccd
Step 3/5 : COPY . .
 ---> 19230669ad27
Step 4/5 : RUN go list
 ---> Running in faefa6d5930e
go: open /go/src/dummy/go.mod: permission denied
The command '/bin/sh -c go list' returned a non-zero code: 1

现在我更改了一个 Dockerfile 以保持事件状态(注释第 4 行:# RUN go list)
所以我可以构建和运行图像
$ docker build -t dummy ~/go/src/dummy
....
Successfully built 385e0629e67f
Successfully tagged dummy:latest

然后我在 docker 中运行 sh,并获得复制文件的权限:
$ docker exec -it 6da5ca617c4d  sh
#-----now we in the docker-----
/go/src/dummy # ls -l
total 12
-rw-r--r--    1 root     root           108 May 23 12:15 Dockerfile
-rw-r--r--    1 root     root            22 May 23 12:03 go.mod
-rw-r--r--    1 root     root             0 May 23 11:48 go.sum
-rw-r--r--    1 root     root            86 May 23 11:50 main.go

但即使我现在将 go.mod 的权限更改为 777
我仍然遇到同样的错误:
#-----in the docker-----
/go/src/dummy # chmod 777 go.mod
/go/src/dummy # go list
go: open /go/src/dummy/go.mod: permission denied

其他版本的 golang 镜像(golang:1.13.11-alpine3.11、1.14.3-alpine3.11 等)也存在同样的问题

同样的问题在实际项目中重现,
所以我无法在 docker 中执行 go get、go list 等。

以前,一切正常,但在某些时候(22.05.2020)出现此错误,文件或配置没有任何更改

请帮忙

最佳答案

尝试更换:

RUN go list



RUN ["chmod", "+rwx", "go list"]

+x should also do. I mentioned +rwx to give an idea on how to set permissions explicitly. For go list: +x permission is just fine.



您可能知道基于 alpine 的图像有 sh壳而不是 bash .

Docker 中 RUN 的默认 shell 是 /bin/sh并且这里的权限设置不正确(问题)。
RUN /bin/bash -c <command>也应该可以工作,但由于基于 alpine 的图像没有开箱即用的 bash,那么显式设置权限应该会对您有所帮助!

关于linux - docker : 'go.mod: permission denied' on go commands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61972280/

相关文章:

python - 将 ast.literal_eval 与 sys.argv 组合

r - 在 Dockerfile 中添加用于从 Github 安装的 R 包

rest - 在Golang中使HTTP请求非法路径

go - 如果我的类型作为流没有意义,是否应该实现io.Reader/io.Writer?

sockets - 从套接字重复读取

c++ - 创建控制台应用程序有什么标准吗?

linux - 隐藏 expect 的输出

linux - Linux 中最好的代码比较工具是什么?

java - 如何更改 docker tomcat 8 中的用户配置?

docker - 在现有的 asp.net core docker 容器上安装 nginx