博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于 Gitlab 交付 Go 程序的 Docker 镜像
阅读量:5789 次
发布时间:2019-06-18

本文共 3377 字,大约阅读时间需要 11 分钟。

Gitlab 提供了完整 CI/CD 功能并且集成了 docker 镜像服务, 可以在此基础上快速实现 docker 镜像交付.

样例工程目录结构如下:

├── .gitlab-ci.yml├── Dockerfile├── Gopkg.lock├── Gopkg.toml├── README.md├── app.conf├── main.go└── vendor复制代码

依赖管理

项目使用 golang 官方包管理工具 dep 进行依赖管理, 参考官方文档:

直接通过 go get 安装 dep

go get -u github.com/golang/dep/cmd/dep复制代码

记得设置环境变量

export PATH=$PATH:$GOPATH/bin复制代码

在工程根目录初始 dep

dep init复制代码

执行之后会生成 Gopkg.toml Gopkg.lock vendor/ 这三文件都需要 commit 进入版本管理系统. 所有的依赖文件都在 vendor/ 目录里. 详细信息参阅 dep 文档. 添加新库或者更新了已有库导致 vendor 目录变更, 需要将变更 commit 进入版本管理里.

Gitlab CI 配置

CI 配置了三个阶段 test build deploy, 配置了 before_script 在每个任务执行前初始 Go 的相关环境变量.

在 test 阶段运行单元测试

在 build 阶段将 Go 程序编译成单体二进制文件, 并作为 artifact 存储, 用于其他阶段的任务使用.

在 deploy 阶段将编译的结果打包成 docker 镜像, 并发布到 registry.

CI 配置文件 .gitlab-ci.yml 内容如下

image: docker:gitstages:  - test  - build  - deploybuild-dev:  stage: build  script:    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY    - docker build --build-arg APP_ROOT=/go/src/$CI_PROJECT_NAME -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME -f docker/test/Dockerfile .    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME  only:    - develop deploy-dev:  stage: deploy  variables:    DOCKER_HOST: $DOCKER_HOST_DEV    DOCKER_TLS_VERIFY: 1    SERVICE_NAME: dev  image: docker:latest  script:    - mkdir -p ~/.docker    - echo "$DOCKER_HOST_TLS_CA_CERT_DEV" > ~/.docker/ca.pem    - echo "$DOCKER_HOST_TLS_CERT_DEV" > ~/.docker/cert.pem    - echo "$DOCKER_HOST_TLS_KEY_DEV" > ~/.docker/key.pem    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY    - docker service update --with-registry-auth --image $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME $TEST_SERVICE_NAME  environment:    name: dev    url: http://${CI_BUILD_REF_NAME}.project.example.com  only:    - dev复制代码

Dockerfile

编写 Dockerfile:

FROM golang:1.9.0ARG  APP_ROOTWORKDIR ${APP_ROOT}COPY ./ ${APP_ROOT}RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .FROM alpine:latest  ARG APP_ROOTRUN apk --no-cache add ca-certificates tzdataWORKDIR /app/RUN mkdir -p ./conf/dev && touch ./conf/dev/app.confCOPY --from=0 ${APP_ROOT}/main .COPY --from=0 ${APP_ROOT}/conf/app.conf ./conf/app.confENV DREAMENV TESTENV DEPLOY_TYPE DOCKERENTRYPOINT ["/app/main"]复制代码

Gitlab registry

Gitlab 内集成了 registry 可以为所有项目提供 docker 镜像服务.

go build -o maindocker login # 输入用户名密码登陆docker built -t registry.gitlab.example.com/group/project -f Dockerfile . # 编译 Docker 镜像docker push registry.gitlab.example.com/group/project # 把 docker 镜像发布到 gitlab registry复制代码

本地测试docker环境编译执行:

go build -o maindocker build -t gitlab-go-docker-demo docker/test/Dockerfile .docker run gitlab-go-docker-demo复制代码

部署

在服务器上登陆 docker registry:

docker login registry.gitlab.example.com复制代码

登陆成功后拉取 docker 镜像:

# 以测试服务器为例, 正式服务器需指定相应版本docker pull registry.gitlab.examlple.com/group/project/test:latest复制代码

运行:

docker run -p 80:80 -v /var/log/:/app/log/ --restart unless-stopped registry.gitlab.example.com/group/project/test复制代码

参考阅读

  • https://github.com/golang/dep

  • https://docs.gitlab.com/ce/ci/docker/using_docker_build.html 详解了如何配置 gitlab-ci docker 构建

  • https://about.gitlab.com/2016/05/23/gitlab-container-registry/ 介绍了关于 gitlab container registry 的使用

  • https://blog.stackahoy.io/a-guide-to-automated-docker-deployments-w-gitlab-ci-510966dd6022 云服务商 stackahoy.io 关于 go 的部署教程

  • https://docs.gitlab.com/ee/ci/yaml/

  • https://docs.gitlab.com/ee/ci/variables/README.html

转载地址:http://ehmyx.baihongyu.com/

你可能感兴趣的文章
自制一个 elasticsearch-spring-boot-starter
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
CSS盒模型
查看>>
ng2路由延时加载模块
查看>>
使用GitHub的十个最佳实践
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
JAVA的优势就是劣势啊!
查看>>
ELK实战之logstash部署及基本语法
查看>>
帧中继环境下ospf的使用(点到点模式)
查看>>
BeanShell变量和方法的作用域
查看>>
LINUX下防恶意扫描软件PortSentry
查看>>
由数据库对sql的执行说JDBC的Statement和PreparedStatement
查看>>
springmvc+swagger2
查看>>