我很难为个人项目设置golang dockerfile。
项目结构为:
Project
|
+-- log.go (contains main)
|
+-- go.mod
|
+-- hash
|
+-- hash.go
该应用程序每5秒打印一个随机哈希,并在其上附加一个时间戳。
文件内容:
日志
package main
import (
"fmt"
"github.com/postelniql/logger-output/hash"
"time"
)
func log() string {
dt := time.Now()
hash := hash.NewSHA1Hash()
return dt.Format("01-02-2006T15:04:05.000Z") + ": " + hash
}
func main() {
fmt.Println(log())
tick := time.Tick(5000 * time.Millisecond)
for range tick {
fmt.Println(log())
}
}
go.mod:
module github.com/postelniql/logger-output
go 1.19
hash.go:
package hash
import (
"crypto/sha1"
"fmt"
"math/rand"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
func NewSHA1Hash(n ...int) string {
noRandomCharacters := 32
if len(n) > 0 {
noRandomCharacters = n[0]
}
randString := randomString(noRandomCharacters)
hash := sha1.New()
hash.Write([]byte(randString))
bs := hash.Sum(nil)
return fmt.Sprintf("%x", bs)
}
var characterRunes =
[]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
// RandomString generates a random string of n length
func randomString(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = characterRunes[rand.Intn(len(characterRunes))]
}
return string(b)
}
我拼凑了以下泊坞文件:
FROM golang:1.19-alpine
WORKDIR /app
COPY go.mod ./
RUN apk add git
RUN go get github.com/postelniql/logger-output/hash
COPY *.go ./
RUN go build -o /logger-output-app
EXPOSE 8080
CMD [ "/logger-output-app" ]
然而,我一直得到这个错误(和类似的错误):
------
> [6/8] RUN go get github.com/postelniql/logger-output/hash:
#10 2.105 go: github.com/postelniql/logger-output/hash: no matching versions for
query "upgrade"
------
executor failed running [/bin/sh -c go get github.com/postelniql/logger-
output/hash]: exit code: 1
我已经在网上搜索了几个小时试图解决这个问题,我真的不明白它有什么问题。当谈到docker文件中的依赖管理时,我怀疑我做错了什么。
我提到我是围棋新手,正在将其编码作为我学习过程的一部分。
请帮我写一个构建并运行的dockerfile。
谢谢
你不需要<code>去获取github。com/postelniql/logger-output/hash:这是本地源代码树的一部分,您在本地拥有它。您需要确保将
复制到图像中。
Dockerfile中的更改并不复杂,但您的Dockerffile一开始就没有那么大:
FROM golang:1.19-alpine
WORKDIR /app
COPY go.mod go.sum ./ # add `go.sum`
RUN go mod download # add: downloads external dependencies
# RUN apk add git # delete
# RUN go get github.com/postelniql/logger-output/hash # delete
COPY *.go ./
COPY hash/ hash/ # add
RUN go build -o /logger-output-app
EXPOSE 8080
CMD [ "/logger-output-app" ]
@Mihai的答案中的 Dockerfile 也应该可以正常工作,因为它还会删除 go 获取你自己的应用程序
行。多阶段构建设置会从最终构建中删除 Go 工具链,因此您可以获得更小的映像,但它也更复杂,更难调试。
这应该行得通,下面解释一下。
#build stage
FROM golang:alpine AS builder
RUN apk add --no-cache git
WORKDIR /go/src/app
COPY . .
RUN go get -d -v ./...
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /go/bin/app -v .
#final stage
FROM alpine:latest
RUN addgroup -S app && adduser -S app -G app
COPY --from=builder --chown=app /go/bin/app /app
USER app
ENTRYPOINT ["/app"]
将Dockerfile放在你的项目中,这样你就不必在里面克隆项目(毫无意义)。
使用 2 阶段构建来获得干净的最终映像。
使用不同于root的用户来运行最终的二进制文件。
不要公开任何端口,因为你的应用未侦听任何端口。
使用ENTRYPOINT而不是CMD。这样,您可以稍后在<code>docker运行</code>命令行上传递参数。
你能帮我在jrxml中设置或更改哪些属性以获得相同的PDF输出吗?
我已经从Godaddy购买了SSL,我的网站托管在AWS中。我想在AWS上设置SSL。我绑定使用证书管理器导入证书。它问了我三件事: 证书体*--在这里,我从Godaddy获得了。crt文件内容 证书私钥*--这里我仍然困惑需要输入什么。请帮我做这个 证书链--在这里我输入了sf_bundle-g2-g1.crt代码。 请帮助我启用AWS中的SSL。提前致谢
站点帮助包括帮助内容和帮助类型。 一、先添加帮助类型 帮助类型包括添加帮助类型操作和帮助类型列表。 帮助列表的显示项包括类型名称、排序和单个帮助类型的删除操作。 添加帮助类型所设置的信息包括帮助类型名称和排序。 二、添加帮助内容 帮助内容包括批量删除操作、添加帮助内容操作和帮助列表。 帮助列表的显示项包括标题、分类、排序、单个帮助的修改、删除和预览操作。点击预览之后,会在浏览器的新标签页打开前台该
我安装了cron和 登录docker镜像 没有正在运行 我想我必须做点什么来启动cron服务器。 我怎么能这样做??
问题内容: 我正在docker容器内的GCE上运行jenkins实例,并希望从此Jenkinsfile和Github执行多分支管道。我正在为此使用GCE詹金斯教程。这是我的 我总是得到一个错误: 为了使docker在jenkins中工作,我需要更改什么? 问题答案: 看起来像DiD(Docker中的Docker),最近的一期杂志指出这是有问题的。 请参阅“ 在您的CI或测试环境中使用Docker-
首先,我是C、C++、C#、Android和Swift的开发人员,但我绝对没有JavaScript、PHP或Web开发经验。 即只接受整数值的输入。 这是刀片代码: