docker golang 开发环境

go 版本的不一致,依赖库不一致,致使编译失败;代码生成工具不一致,致使生成代码有问题;依赖工具缺失,致使测试不经过等等,开发环境和生产环境之间的差别会致使各类各样奇怪的问题,而 docker 特别擅长解决这种一致性问题python

整体方案

最简单粗暴的一种方式就是每次都将代码拷贝到一个新的容器内,执行编译,编译完成后直接将容器制做成镜像,但这种方式每次编译都须要从新拉取依赖,比较耗时mysql

咱们采用在这个基础上稍做优化,启动一个固定的容器用于编译,编译完成后将生成的结果拷贝出来,制做新的镜像,能达到近乎本地编译的效果linux

编译环境镜像

没有直接使用 dockerhub 上的 golang 镜像,是由于咱们的项目除了 golang 可能还依赖一些别的工具,好比 makefile,python,protoc 等等,就须要本身制做镜像了,这里我选 centos 做为基础镜像,主要是考虑到后面制做服务镜像的时候也仅须要 centos 便可,不须要完整的 golang 环境git

FROM centos:centos7
RUN yum install -y kde-l10n-Chinese && yum reinstall -y glibc-common && localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 
RUN yum install -y epel-release
RUN yum install -y docker-io
RUN yum install -y go
RUN yum install -y make

# behave support
RUN yum install -y python36 python36-setuptools python36-pip
RUN pip3 install --upgrade pip
RUN pip3 install requests
RUN pip3 install flask
RUN pip3 install redis
RUN pip3 install pymongo
RUN pip3 install behave
RUN pip3 install pyhamcrest
RUN pip3 install pymysql
RUN pip3 install cryptography
RUN pip3 install grpcio grpcio-tools

# grpc support
RUN yum install -y unzip
RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.10.0/protoc-3.10.0-linux-x86_64.zip
RUN unzip protoc-3.10.0-linux-x86_64.zip
RUN export GOPROXY=https://goproxy.cn && \
    mkdir -p /src/google.golang.org/grpc && \
    cd /src/google.golang.org/grpc && \
    export GOPATH=/ && \
    export GO111MODULE=on && \
    go mod init && \
    go get -u google.golang.org/grpc && \
    go get -u github.com/golang/protobuf/protoc-gen-go

ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh
ENV LC_ALL=zh_CN.UTF-8

编译环境镜像能够尽量多地安装须要的工具,不用担忧镜像过大,由于这个镜像咱们仅仅用来编译github

这里我安装了 make,python,behave 以及 protobuf 工具golang

启动编译环境容器

.PHONY: buildenv
buildenv:
    if [ -z "$(shell docker network ls --filter name=testnet -q)" ]; then \
        docker network create -d bridge testnet; \
    fi
    if [ -z "$(shell docker ps -a --filter name=go-build-env -q)" ]; then \
        docker run --name go-build-env --network testnet -d hatlonely/go-env:v1.1.0 tail -f /dev/null; \
    fi

hatlonely/go-env:v1.1.0 为上一步制做的镜像,启动命令 tail -f /dev/null 是为了让容器一直存在而不退出,这样就能够一直复用这个容器执行编译redis

编译

.PHONY: image
image: buildenv
    docker exec go-build-env rm -rf /data/src/${gituser}/${repository}
    docker exec go-build-env mkdir -p /data/src/${gituser}/${repository}
    docker cp . go-build-env:/data/src/${gituser}/${repository}
    docker exec go-build-env bash -c "cd /data/src/${gituser}/${repository} && make output"
    mkdir -p docker/
    docker cp go-build-env:/data/src/${gituser}/${repository}/output/${repository} docker/
    docker build --tag=hatlonely/${repository}:${version} .

使用 docker cp 命令将本地代码拷贝到容器里面,执行 docker exec 在 docker 内部执行编译,编译完成后,再用 docker cp 将编译结果拷贝到本机的 docker/ 目录sql

最后再用 Dockerfile 建立出一个新的服务镜像,对应的 Dockerfile 内容以下docker

服务镜像

FROM centos:centos7

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >> /etc/timezone

COPY docker/tpl-go-http /var/docker/tpl-go-http
RUN mkdir -p /var/docker/tpl-go-http/log

EXPOSE 7060

WORKDIR /var/docker/tpl-go-http
CMD [ "bin/echo", "-c", "configs/echo.json" ]

连接

转载请注明出处
本文连接: https://tech.hatlonely.com/article/54
相关文章
相关标签/搜索