本人一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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐