【问题标题】:user: Current not implemented on linux/amd64 with golang using docker scratch用户:当前未在 linux/amd64 上使用 docker scratch 使用 golang 实现
【发布时间】:2015-04-27 14:31:49
【问题描述】:

我已经使用this 教程编译了我的 Go 应用程序以在从头开始派生的容器上运行。

我的 go 代码使用来自 os/useruser.Current()。当我使用博客文章中的技术时,运行容器时出现以下错误:

user: Current not implemented on linux/amd64

详细说明:

这是用于编译的命令:

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

这是用于创建镜像的 Dockerfile(基于scratch):

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
ADD main /
ENTRYPOINT ["/main"]

这是用于运行容器的命令:

sudo docker run -it -v /var/run/docker.sock:/var/run/docker.sock --rm 813

有人遇到过吗?有什么解决办法吗?

【问题讨论】:

  • 用户 db 访问需要在 linux 上使用 cgo。
  • 另外,你想用user.Current做什么?如果您不需要查找用户信息,可以使用os.Getuid
  • 谢谢吉姆。将尝试使用 os.Getuid 并报告。
  • 您也可以通过使用$USER 环境变量来获得所需的内容。

标签: go docker


【解决方案1】:

Linux 上os/user 包的用户信息查找是使用getpwuid_r 系统调用实现的,因此在使用CGO_ENABLED=0 编译时将不起作用。

虽然在 Go 中实现 /etc/passwd 解析器听起来很简单,但 getpwuid 函数可能会从不同的来源检索用户信息。例如,在某些系统上,它可能使用 LDAP 目录。所以获得奇偶校验的唯一方法是委托给 C 库。

【讨论】:

  • 谢谢詹姆斯。我的最终目标是为我的 golang 应用程序创建一个小容器。 AFAIU 从您的回答中可以通过与 C 库静态链接来实现。它是否正确?如果是这样,你能分享一下如何做的指针吗?
  • @DimaStopel:静态链接 glibc 不是一个好主意(链接器会发出警告,指出这一点),因为运行时 glibc 仍然必须匹配确切的版本。
  • 像 @JimB 一样,我不建议使用 libc 进行静态链接。如果您需要它,只需将其包含在您的容器中即可。话虽如此,如果您的应用是容器中唯一的东西,那么您实际上需要 user.Current() 做什么?
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 2022-07-11
  • 2023-03-15
  • 2010-09-19
  • 2016-03-06
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多