docker - 在 .dockerignore 文件中包含 pkg

标签 docker go goinstall

现在我的 .dockerignore 文件有这个内容:

.vscode
.idea
.git
bin
pkg

我的 Dockerfile 看起来像:

FROM golang:latest
RUN mkdir -p /app
WORKDIR /app
COPY . .
ENV GOPATH /app
RUN go install huru
EXPOSE 3000
ENTRYPOINT /app/bin/huru

我的问题是 - 我是否应该将 pkg 文件夹从主机复制到镜像?现在我不是,正如我的 dockerignore 文件所表明的那样。

我觉得我应该将 pkg 文件夹从主机复制到镜像,因为其中可能包含 go install 可以使用的预构建文件,而不是从重新下载源代码github 等?

最佳答案

就个人而言,我认为将 pkg 文件夹从主机复制到镜像不是一个好主意,因为:

  • 它将构建图像的地方(您的主机)和图像本身紧密结合在一起。根据构建图像的位置,生成的图像可能会有所不同,这可能是您不想要的
  • 此外,如果您有自动构建(例如来自 CI),您可能每次都从干净的环境重建整个应用程序,因此没有初始pkg 要复制的文件夹。

如果您熟悉 Java 世界,我已经遇到过使用 Maven 构建图像的问题。为了加快构建速度,一些人正在复制镜像中的本地 Maven 存储库 (~/.m2) 以避免重新下载工件。我不是特别同意这一点,因为他们的 .m2 文件夹总是存在包含损坏工件的风险:因此,在他们的机器上构建的图像将不同于在干净的机器上构建的图像环境。这取决于您是想要一致构建还是快速构建(我更喜欢前者)。

总而言之,我认为从干净的环境构建镜像,而不依赖于构建镜像的主机,是一种很好的做法。这就是为什么我个人不会在图像中复制任何文件(应用程序源代码除外!)。

关于docker - 在 .dockerignore 文件中包含 pkg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137590/

相关文章:

amazon-web-services - AWS Elastic Beanstalk Docker 容器的重启策略

docker - docker镜像可以用作可启动镜像吗

postgresql - panic : sql: expected 1 destination arguments in Scan, 不是 <number> golang、pq、sql

go - 模板范围中的最后一项

go - 强制 `go get` 和 `go install` 使用缓存,即使它是古老的

macos - $GOPATH 已设置但 go install 不起作用

java - 无法访问 localhost 中的 Tomcat 默认页面 :8080 for Ubuntu 16. 04 Docker 容器

docker - 在docker hub中找到基本镜像或 ''源''以获取本地镜像

eclipse - 如何安装基于 golang 的所有内部文件夹的网络应用程序

go - 如何使 template.Execute() 写入文件而不是 response.Writer?