Docker项目打包之shell启动项目

目录

前言

简单叙述

踩坑记录以及解决方法

shell脚本申明

程序语言安装部分linux程序包

Docker时区调整

镜像启动容器退出解决方法

完整Dockerfile实例


前言

  本文主要讲真实项目打包成镜像的过程。以前我打包的项目是只有一个main文件,直接启动main文件,而这次的项目是用sehll脚本启动,脚本启动应该也是比较常见的情况之一。

简单叙述

  这次打包的项目是golang作为开发语言,微服务架构开发的服务。有一个对外的api服务接口,有多个对内的grpc服务。每个grpc服务可以根据配置文件中的端口数量,在shell脚本中读取每个grpc对应的端口,启动与之相应的grpc服务。所以整个项目是通过shell脚本执行的。

踩坑记录以及解决方法

shell脚本申明

  我们平时项目部署都是在linux环境下,项目运行以及脚本的执行都完全没问题。所以dockerfile如下:

FROM golang:1.15 as build

..........中间省略........

WORKDIR /home/e-chat/script
RUN chmod +x *.sh
CMD ["./start_all.sh"]

就会报错。比如如下错误:无法识别souce命令,以及shell中的数组符号 "("

./auto_start_rpc.sh: 3: ./auto_start_rpc.sh: source: not found
./auto_start_rpc.sh: 4: ./auto_start_rpc.sh: source: not found
./auto_start_rpc.sh: 5: ./auto_start_rpc.sh: source: not found
./auto_start_rpc.sh: 8: ./auto_start_rpc.sh: Syntax error: "(" unexpected

但是我打包的项目是在golang镜像作为基础打包的,所以没有linux环境,不能使用shell脚本。

解决方法:

1.使用centos或者unbantu镜像,安装golang,然后执行脚本。这样做的好处就是完全和服务器相同的linux环境,所以基本不会遇到什么问题,坏处就是镜像很大。

2.这点是重点推荐的,改变shell脚本申明方式:#!/usr/bin/sh    -------->替换为------->  #!/usr/bin/env bash    就能在非linux环境下使用shell脚本了。

程序语言安装部分linux程序包

  golang作为基础镜像构建的项目,想使用linux一些命令,比如我们项目中shell脚本,需要用到命令,ps,netstat,awk,vim等等命令,但是这些命令golang是不支持的,需要就需要安装才能使用。

1.对于不需要程序交互的安装包,直接apt-get-install dockerfile中如下写:

RUN apt-get install apt-transport-https && apt-get update && apt-get install procps\
&&apt-get install net-tools

2.对于需要交互的安装包,不停的询问你,让你输入y/n才能进行下一步,是不能直接安装的,需要如下步骤。比如安装,vim和awk等。采用如下安装

#非交互式操作
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y vim curl tzdata gawk

Docker时区调整

docker默认的时区是UTC,而我们所在的时区是东八区,我们部署完项目查看日志或者控制台看到时间总是差几个小时,就需要把时区换位我们国家所在的时区。

#时区调整为东八区
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

镜像启动容器退出解决方法

Docker 不是虚拟机,容器也是进程。既然是进程,那么在启动容器的时候,执行完命令就退出了对容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出。

所以我们需要阻塞进程,博主是阻塞脚本,让脚本一直执行,这样容器发现程序一直运行,容器就会一直执行,就不会退出。如下shell:start_all.sh实例:

#!/usr/bin/env bash

#--------省略shell 逻辑代码----#

#上面逻辑代码执行完,就一直死循环,阻塞脚本
while [ true ]; do
  sleep 1
done

 

完整Dockerfile实例

FROM golang:1.15 as build

RUN rm -rf /var/lib/apt/lists/*

RUN apt-get install apt-transport-https && apt-get update && apt-get install procps\
&&apt-get install net-tools
#非交互式操作
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y vim curl tzdata gawk
#时区调整为东八区
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata


# go mod安装源 容器环境变量添加,会覆盖默认的变量值
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct

#挂载目录 保存日志
VOLUME /home/log

# 设置工作目录
WORKDIR /home/e-chat

# 把全部文件添加到容器内
COPY . .

WORKDIR /home/e-chat/script
RUN chmod +x *.sh
CMD ["./start_all.sh"]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Docker,Dockerfile)