- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我刚开始使用 Go (golang),想要为将使用 Gradle 构建并部署到 Docker 镜像的项目设置一个新的项目文件夹结构。我正在努力确定这个项目结构可能是什么样子,主要是因为 GOPATH 结构以及 Go 语言工具似乎与使用 Gradle 或配置可克隆项目 (Git) 对立的事实。
该项目最终将包含各种用 Go 编写的服务器端代码、用 HTML 和 JavaScript 编写的客户端代码,因此我需要一个适合 Gradle 的项目结构来构建和打包所有这些类型的部分。
有人对此有良好的工作结构和工具建议吗?
最佳答案
当我开始使用 Go 时,我摆弄了各种各样的构建工具,来自 maven至 gulp .
事实证明,至少对我来说,它们弊大于利,所以我开始使用 Go 看似不起眼但经过深思熟虑的功能。其中之一是 go generate
.添加简单的 shell 脚本或偶尔添加 Makefile 以实现自动化。
我整理了一个示例项目来使这一点更清楚
/Users/you/go/src/bitbucket.org/you/hello/
├── Dockerfile
├── Makefile
├── _templates
│ └── main.html
└── main.go
这是一个简单的网络服务器,服务于“Hello, World!”使用一个模板,该模板使用优秀的 go.rice 嵌入到二进制文件中工具:
//go:generate rice embed-go
package main
import (
"html/template"
"log"
"net/http"
rice "github.com/GeertJohan/go.rice"
)
func main() {
templateBox, err := rice.FindBox("_templates")
if err != nil {
log.Fatal(err)
}
// get file contents as string
templateString, err := templateBox.String("main.html")
if err != nil {
log.Fatal(err)
}
// parse and execute the template
tmplMessage, err := template.New("message").Parse(templateString)
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := tmplMessage.Execute(w, map[string]string{"Greeting": "Hello, world!"}); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil))
}
注意这行
//go:generate rice embed-go
当您调用 go generate
时,您的源文件将被扫描以查找此类行,并执行相应的命令。在这种情况下,将生成一个名为 rice-embed.go 的文件,您的目录将如下所示:
/Users/you/go/src/bitbucket.org/you/hello/
├── Dockerfile
├── Makefile
├── _templates
│ └── main.html
├── main.go
└── rice-box.go
例如,您可以在 //go generate
中调用 webpack,将您的东西放在一起,然后另一个 generate 从结果中创建一个 rice-box.go
。这样,您所有的东西都将嵌入到您的二进制文件中,并且可以轻而易举地进行部署。
我在这个例子中使用了一个相当简单的 Dockerfile:
FROM alpine:latest
MAINTAINER You <you@example.com>
COPY hello /usr/bin
EXPOSE 8080
CMD ["/usr/bin/hello"]
但是这给我们带来了一个问题:我们不能使用 go:generate
来生成 docker 镜像,因为我们需要调用 go:generate
,新的二进制文件尚未构建。这会让我们做一些丑陋的事情,比如
go generate && go build && go generate
导致 docker 镜像构建两次等等。所以,我们需要一个不同的解决方案
我们当然可以想出类似的东西:
#!/bin/bash
# Checks for existence omitted for brevity
GO=$(which go)
DOCKER=$(which docker)
$GO generate
$GO test
$GO build
$DOCKER -t you/hello .
但是,这会带来一个问题:您将始终使用 shell 脚本完成整个序列。即使您只想运行测试,最终也会构建 docker 镜像。随着时间的推移,这会加起来。在这种情况下,我倾向于使用
Makefile 是 GNU make 的配置文件
CC = $(shell which go 2>/dev/null)
DOCKER = $(shell which docker 2>/dev/null)
ifeq ($(CC),)
$(error "go is not in your system PATH")
else
$(info "go found")
endif
ifeq ($(DOCKER),)
$(error "docker not in your system path")
else
$(info "docker found")
endif
.PHONY: clean generate tests docker all
all: clean generate tests hello docker
clean:
$(RM) hello rice-box.go cover.out
generate:
$(CC) generate
tests: generate
$(CC) test -coverprofile=cover.out
hello: tests
$(CC) build
docker: hello
$(DOCKER) build -t sosample/hello .
完整的解释超出了这个答案的范围,但是你在这里基本上可以做的是你可以调用 make
并且将构建 all
目标:文件从旧构建中删除(clean
),生成新的 rice-box.go
(generate
)等等。但是,如果您只想运行测试,调用 make test
只会执行目标 clean
、generate
和 tests
。
关于docker - golang、docker、gradle的项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45425749/
我正在使用以下dockerfile: FROM ubuntu:14.04 MAINTAINER xxx xxx # SSH RUN apt-get update && apt-get install
我运行了docker-compose build celery,(经过数小时的尝试,我的连接不良)成功了。 app Dockerfile的前80%是相同的,但不会重复使用缓存。从我可以浏览的内容来看,
我可以使用以下命令成功创建 Docker 注册表 v2 服务:docker service create 然后我使用 docker Push 将一些图像推送到该服务。 当我通过 curl localh
我正在尝试使用 gitlab 构建 CI,我从 docker 的 docker 镜像开始,我的前端存储库没有任何问题,但现在使用相同的 gitlab-ci 配置文件,我有此守护程序错误。 这是构建的输
用例: 我们在 Jenkins 中有几个“发布作业”build 和 push 应用程序的 Docker 镜像到 docker registry,更新各种文件中的项目版本,最后将发布标签推送到相应的 G
当我尝试构建我的 docker 文件时,docker 返回以下错误: [+] Building 0.0s (1/2)
docker-in-docker 的作者在此博客中建议不要将此图像用于 CI 目的: jpetazzo/Using Docker-in-Docker for your CI or testing en
我创建了一个 Dockerfile 来在 Docker 中运行 Docker: FROM ubuntu:16.04 RUN apt-get update && \ apt-get in
我尝试为 Docker 镜像定位一个特定标签。我怎样才能在命令行上做到这一点?我想避免下载所有图像,然后删除不需要的图像。 在 Ubuntu 官方版本中,https://registry.hub.do
我正在尝试在docker中运行docker。唯一的目的是实验性的,我绝不尝试实现任何功能,我只想检查docker从另一个docker运行时的性能。 我通过Mac上的boot2docker启动docke
docker-compose.yml version: "3" services: daggr: image: "docker.pvt.com/test/daggr:stable"
我有一个非常具体的开发环境用例。在一些代码中,我启动了一个容器来抓取页面并检索在容器中运行的服务(Gitlab)的 token 。 现在,我希望 Dockerize 运行它的代码。具体来说,类似: o
之前已经问过这个问题,但我不确定当时是否可以使用docker-compose文件完成docker堆栈部署。 由于最新版本支持使用compose将服务部署到堆栈,因此,我无法理解dab文件的值。 我检查
我在一次采访中被问到这个问题,但无法回答。也没有找到任何相关信息。 最佳答案 正如 Docker 文档中所述,Docker 注册表是: [...] a hosted service containin
有没有一种方法可以将具有给定扩展名的所有文件复制到Docker中的主机?就像是 docker cp container_name:path/to/file/in/docker/*.png path/o
我的日志驱动程序设置为journald。使用日志记录驱动程序时,daemon.json文件中的日志级别配置会影响日志吗?使用docker logs 时仅会影响容器日志? 例如,docker和journ
我最近开始使用Docker + Celery。我还共享了full sample codes for this example on github,以下是其中的一些代码段,以帮助解释我的观点。 就上下文
运行docker build .命令后,尝试提交构建的镜像,但收到以下错误 Step 12 : CMD activator run ---> Using cache ---> efc82ff1ca
我们有docker-compose.yml,其中包含Kafka,zookeeper和schema registry的配置 当我们启动docker compose时,出现以下错误 docker-comp
我是Docker的新手。是否可以在Docker Hub外部建立Docker基本镜像存储库?假设将它们存储在您的云中,而不是拥有DH帐户?谢谢。 最佳答案 您可以根据需要托管自己的注册表。可以在Depl
我是一名优秀的程序员,十分优秀!