Golang编译后文件 结合Docker + Docker-compose 个人探索经验分享
本人一golang小白,beego项目终于学到了部署阶段,nohup太low了,还是喜欢用docker和docker-compose(主要:supervisor不熟,k8s不会,哈哈)bee pack -be GOOS=linux主要目的,解决:docker: Error response from daemon:OCI runtime create failed: container_linux
本人一golang小白,beego项目终于学到了部署阶段,nohup太low了,
还是喜欢用docker和docker-compose(主要:supervisor不熟,k8s不会,哈哈)
bee pack -be GOOS=linux
主要目的,解决:
docker: Error response from daemon:
OCI runtime create failed: container_linux.go:345:
starting container process caused "exec: \"/app\":
permission denied": unknown.
环境说明
CentOS 7.9
Docker Version: 20.10.8
Docker -compose version 1.29.2
废话不多说,懂得人自然懂,上代码(这是最终版的,过程放在后面讲)
第一步:建立镜像
vim Dockerfile
#--------------------------------
FROM alpine
LABEL maintainer="SuPerMix <zhangbest5@163.com>"
ENV TZ=Asia/Shanghai LANG=C.UTF-8
RUN echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/main' > /etc/apk/repositories \
&& echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/community' >>/etc/apk/repositories \
&& apk update && apk add tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
WORKDIR /go/src/
#--------------------------------
docker build -t go_alpine:v1 .
操作目的:
- 使用最精简版基础镜像 alpine (5.6M),没有对比就没有伤害(官方golang 941M)
- 生成镜像:go_alpine:v1
解决问题点:
- 时区问题:
RUN echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/main' > /etc/apk/repositories \ && echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/community' >>/etc/apk/repositories \ && apk update && apk add tzdata \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone
这是这个极简镜像的问题,其他官方大容量版本的没有发现时区问题
顺便解决了docker logs [容器名] 显示时区问题,时区正常了 docker logs 信息也就正常了(查资料时,有文章说,docker官方为了力保时间准确改不了,反正我这docker最新版,时区改过来,logs也正常了)
第二步:Docker-compose制作
vim docker-compose.yml
#--------------------------------
version: '3'
services:
go_mybeego:
image: go_alpine:v1
restart: always
ports:
- "80:8080"
volumes:
- /mnt/data/wwwroot/gm_mybeego/htdocs/:/go/src/
command: /bin/sh -c "chmod a+x /go/src/mybeego"
entrypoint: ["./mybeego"]
container_name: go_mybeego
#--------------------------------
操作目的:
- 使用之前制作好的极简版镜像
- 直接数据卷挂载 /mnt/data/wwwroot/gm_mybeego/htdocs/ 中放了所有使用beego 编译后的文件,详细版的挂载卷为
volumes: #这里细分了,也可以直接一句: - /mnt/data/wwwroot/gm_mybeego/htdocs/:/go/src/ - /mnt/data/wwwroot/gm_mybeego/htdocs/conf/:/go/src/conf/:ro - /mnt/data/wwwroot/gm_mybeego/htdocs/static/:/go/src/static/:ro - /mnt/data/wwwroot/gm_mybeego/htdocs/views/:/go/src/views/:ro - /mnt/data/wwwroot/gm_mybeego/htdocs/logs/:/go/src/logs/:rw - /mnt/data/wwwroot/gm_mybeego/htdocs/upload/:/go/src/upload/:rw - /mnt/data/wwwroot/gm_mybeego/htdocs/mybeego:/go/src/mybeego
解决问题点:
- 解决 permission denied": unknown
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/mybeego\": permission denied": unknown.
主要是这一句解决,没有执行权限问题
command: /bin/sh -c "chmod a+x /go/src/mybeego"
- 解决启动指定默认执行的任务问题:
entrypoint: ["./mybeego"]
这样就不用把执行文件打包到Docker的镜像里了,通过挂载进去。
第三步:启动,搞定
注意:这个alpine 进入容器的话,得用这个 /bin/bash 不行
#【极简版】
docker exec -it [容器名] /bin/sh
下面絮叨下,问题处理的另一方法,及一些心得
思路:把编译后文件打入镜像,但一样得给执行权限
目录结构
── docker-compose.yml
└── golang
├── Dockerfile
└── mybeego【发布编译完成后的文件,必须放这,Dockerfile上下文就找这,绝对路径也不好使】
DockerFile如下:(两版,自行选下,一小白貌似这极简版也可以的)
【极简版】镜像5.6M【默认的alpine会有时区问题】
vim Dockerfile
#--------------------------------
FROM alpine
LABEL maintainer="SuPerMix <zhangbest5@163.com>"
ENV TZ=Asia/Shanghai LANG=C.UTF-8
RUN echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/main' > /etc/apk/repositories \
&& echo 'http://mirrors.ustc.edu.cn/alpine/v3.5/community' >>/etc/apk/repositories \
&& apk update && apk add tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
COPY mybeego /go/src/mybeego
RUN chmod a+x /go/src/mybeego
WORKDIR /go/src/
ENTRYPOINT ["./mybeego"]
【官方版】镜像941M【时区正常】
vim Dockerfile
#--------------------------------
FROM golang
LABEL maintainer="SuPerMix <zhangbest5@163.com>"
RUN apt-get update && apt-get install -y vim
ENV TZ=Asia/Shanghai LANG=C.UTF-8
COPY mybeego$GOPATH/src/mybeego
RUN chmod a+x $GOPATH/src/mybeego
WORKDIR $GOPATH/src/
ENTRYPOINT ["./mybeego"]
docker-compose
vim docker-compose.yml
#--------------------------------
version: '3'
services:
go_mybeego:
build: ./golang
restart: always
ports:
- "80:8080"
volumes:
- /mnt/data/wwwroot/gm_mybeego/htdocs/conf/:/go/src/conf/:ro
- /mnt/data/wwwroot/gm_mybeego/htdocs/static/:/go/src/static/:ro
- /mnt/data/wwwroot/gm_mybeego/htdocs/views/:/go/src/views/:ro
- /mnt/data/wwwroot/gm_mybeego/htdocs/logs/:/go/src/logs/:rw
- /mnt/data/wwwroot/gm_mybeego/htdocs/upload/:/go/src/upload/:rw
container_name: go_mybeego
#--------------------------------
查看内连
#【极简版】
docker exec -it [容器名] /bin/sh
#【官方版】
docker exce -it [容器名] /bin/bash
清理镜像
docker image prune
更多推荐
所有评论(0)