当前位置: 首页 > 知识库问答 >
问题:

需要帮助设置戈兰泊坞站文件

锺离阿苏
2023-03-14

我很难为个人项目设置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。

谢谢

共有2个答案

蓬宾白
2023-03-14

你不需要<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 工具链,因此您可以获得更小的映像,但它也更复杂,更难调试。

段干博涉
2023-03-14

这应该行得通,下面解释一下。

#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开发经验。 即只接受整数值的输入。 这是刀片代码: