【问题标题】:Running a go script wtih cron in Docker在 Docker 中使用 cron 运行 go 脚本
【发布时间】:2021-07-05 09:34:49
【问题描述】:

我一直在尝试在 Ubuntu 16.04 Docker 映像下使用 cron 运行 go 脚本。这是我的文件

Dockerfile

FROM couchbase

RUN apt-get update
RUN apt-get install gcc make -y
RUN apt-get install golang-1.10 git -y

ADD src/crontab.txt /crontab.txt
ADD src/backup.sh /backup.sh
ADD src/backup.go /backup.go
ADD src/file.txt /file.txt
COPY entry.sh /entry.sh

RUN chmod 755 /backup.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt

RUN apt-get install vim -y

CMD ["/entry.sh"]

entry.sh

#!/bin/sh
/usr/sbin/cron -f -l 8

src/crontab.txt

* * * * * /backup.sh >> /var/log/backup.log

src/backup.sh

#!/bin/sh
chmod 666 /var/log/backup.log
/usr/lib/go-1.10/bin/go run backup.go

backup.go

package main

import (
    "log"
    "os"
    "strings"
)

func init() {
    file, err := os.OpenFile("/var/log/backup.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        log.Fatal(err)
    }
    log.SetOutput(file)
}

func main() {
    log.Println("Writing log")
}

我检查了一下,cron 任务每分钟都在运行。 go 安装在文件夹中,当我执行到容器中时它可以工作,但是 backup.go 脚​​本没有记录任何内容。当我手动触发脚本时,它可以工作。我正在使用的容器有 Ubuntu 16.04,我想要它,因为我不必安装沙发底座。

【问题讨论】:

  • Go 没有“脚本”;您的意思是在 Dockerfile 中编译程序吗?
  • @mahendra Go 会自动execute init() functions when a package is initialized。 (但就风格而言,我会尽可能避免使用它们:如果当前用户无法写入 /var/log,则在任何情况下(包括测试),该程序几乎都会默默地启动失败。)
  • @DavidMaze 我希望能够执行它,因为我可以使用 go run 在本地执行它。您会推荐什么方法来避免静默失败并进行适当的日志记录?
  • 将 backup.go 编译为二进制文件,然后重试。去建造。
  • @EddwinPaz 尝试执行 go build backup.go 然后 ./backup,但仍然没有结果。

标签: docker go cron ubuntu-16.04 couchbase


【解决方案1】:

您可以使用multi stage build 更简单地完成此操作。首先使用 Go 映像从您的 src/backup.go 编译一个独立的可执行文件。然后切换到coughbase 图像并复制上一步的可执行文件。

Dockerfile:

# use a first-stage image to build the go code
# we'll change it later
FROM golang:1.10 AS build

# for now we only need the go code
COPY src/backup.go backup.go

# build a standalone executable
RUN go build -o /backup backup.go

# switch to a second-stage production image
FROM couchbase

# setup cronjob
COPY src/crontab.txt /crontab.txt
RUN /usr/bin/crontab /crontab.txt

# copy the executable from the first stage
# into the production image
COPY --from=build /backup /backup

CMD ["/usr/sbin/cron", "-f", "-l", "8"]

src/crontab.txt:

* * * * * /backup >> /var/log/backup.log

像这样构建和运行:

docker build . -t backup

# start in backgroud
docker run --name backup -d test

# check if it works
docker exec backup tail -f /var/log/backup.log

下一分钟:

2021/04/09 19:05:01 Writing log

【讨论】:

    猜你喜欢
    • 2014-11-22
    • 2015-12-12
    • 2011-05-26
    • 2011-05-28
    • 2015-05-06
    • 1970-01-01
    • 2016-08-14
    • 2016-09-07
    相关资源
    最近更新 更多