Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker中运行带有cron的go脚本_Docker_Go_Cron_Ubuntu 16.04_Couchbase - Fatal编程技术网

在Docker中运行带有cron的go脚本

在Docker中运行带有cron的go脚本,docker,go,cron,ubuntu-16.04,couchbase,Docker,Go,Cron,Ubuntu 16.04,Couchbase,我一直在尝试在Ubuntu16.04Docker映像下使用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 /ba

我一直在尝试在Ubuntu16.04Docker映像下使用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
备份,开始

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,我想要它,因为我不必安装couchbase。

你可以通过使用一个。首先使用Go映像从
src/backup.Go
编译一个独立的可执行文件。然后切换到
cougbase
图像,并从上一步复制可执行文件

Dockerfile:

#使用第一阶段映像构建go代码
#我们以后再换
来自golang:1.10竣工时
#现在我们只需要go代码
复制src/backup.go backup.go
#构建一个独立的可执行文件
运行go build-o/backup.go
#切换到第二阶段生产映像
从卧铺
#设置cronjob
复制src/crontab.txt/crontab.txt
运行/usr/bin/crontab/crontab.txt
#从第一阶段复制可执行文件
#进入生产形象
复制--从=生成/备份/备份
CMD[“/usr/sbin/cron”、“-f”、“-l”、“8”]
src/crontab.txt:

* * * * * /backup >> /var/log/backup.log
按如下方式构建和运行:

docker构建-t备份
#从背景开始
docker运行--名称备份-d测试
#检查它是否有效
docker exec backup tail-f/var/log/backup.log
下一分钟:

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

Go没有“脚本”;你的意思是在Dockerfile中编译程序吗?@mahendra Go将自动运行。(但作为一种风格,我会尽可能避免使用它们:如果当前用户无法写入
/var/log
,则在任何上下文(包括测试)中,该程序几乎都会以静默方式无法启动。)@DavidMaze我希望能够执行它,因为我可以使用go run在本地执行它。您建议采用什么方法来避免静默故障并进行适当的日志记录?将backup.go编译为二进制文件,然后重试。go build。@EddwinPaz尝试执行go build backup.go,然后执行./backup,但仍然没有结果。