Docker 编译 Go 项目

Docker 编译 Go项目

  • 背景
  • 步骤
    • 1. 构建一个基础镜像
    • 2. 在基础镜像上构建一个临时镜像编译
    • 3. 拷贝出编译的程序

背景

Go项目中用到cgo特性,生产环境部署时有的机器因glibc版本过低无法运行
version 'GLIBC_2.32' not found, required by bin/main
因此需要一个自动化部署的方法,一一部署环境太麻烦,采用docker环境构建

步骤

1. 构建一个基础镜像

镜像版本可根据目标需求选择,这里以centos6为例

  • 使用国内镜像golang.google.cn下载安装go
  • 安装gcc 以编译一些cgo项目
  • 配置gorpoxy

centos6-go-base.dockerfile

FROM centos:centos6ARG APPDIR=go-appRUN set -ex && \mkdir -p /${APPDIR} && \yum install wget gcc -y && \wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz && \tar -C /usr/local/ -xzf go1.21.1.linux-amd64.tar.gz && \sed -i '$a export PATH=$PATH:/usr/local/go/bin' /etc/bashrc && \source /etc/bashrc && \go env -w GO111MODULE=on && \go env -w GOPROXY=https://goproxy.cn,directWORKDIR /${APPDIR}
CMD [ "bash" ]

构建镜像

docker build -t=centos6-go-base:1.0.0 -f=centos6-go-base.dockerfile .

2. 在基础镜像上构建一个临时镜像编译

新建build.dockerfile放置GO项目根目录下

build.dockerfile

FROM centos6-go-base:1.0.0# 因为要用到cgo,所以设置1
ENV CGO_ENABLED=1
ENV PATH="$PATH:/usr/local/go/bin"
ARG APPDIR=go-app
ARG EXE=serverCOPY . /${APPDIR}RUN set -ex && \go mod tidy && \go build -ldflags '-s -w' -o ${EXE} && \echo '编译完成'CMD [ "bash" ]

3. 拷贝出编译的程序

使用脚本运行一个临时镜像,拷贝完毕后再删除
cd 到项目根目录

# EXE=要输出的文件名, 同步骤2保持一致
EXE=myserver
docker build --build-arg=EXE=${EXE} -f=build.dockerfile -t=${EXE}-temp .
docker run -d  --name ${EXE}-temp ${EXE}-temp:latest
echo "info: docker cp ${EXE}-temp:/go-app/${EXE} ."
docker cp ${EXE}-temp:/go-app/${EXE} .
docker rm ${EXE}-temp
docker image rm ${EXE}-temp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(C语言)——双链表

有了单链表的编写经验&#xff0c;双链表变得格外容易。点击看前一篇-单链表 下面是代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define E int typedef struct node {E element;struct node* pre;struct node* next; }node; void initialise(node* h…

JavaScript中的`async`和`await`关键字的作用

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ async关键字⭐ await 关键字3. 错误处理 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对We…

selenium中ActionChains方法详细讲解

前言 本文将介绍Selenium中的ActionChains类及其使用方法&#xff0c;帮助您模拟用户在网页上的鼠标和键盘操作。了解ActionChains的常用方法和示例代码&#xff0c;可轻松实现移动鼠标、点击元素、拖拽元素等操作。通过本文的学习&#xff0c;您能更好地应用ActionChains解决自…

nginx中sent_timeout属性使用注意事项

send_timeout使用注意事项 send_timeout:指客户端向服务器发送请求并且等待服务器返回数据的时间&#xff0c;超过这个时间链接就断开。如果咱们返回的数据复杂&#xff0c;很耗时&#xff0c;就将该值设置大些。注意该时间指准备过程&#xff0c;不是传输过程&#xff08;下载…

Python基础指令(上)

Python基础指令上 常量和表达式变量和类型1. 什么是变量2. 变量的语法2.1 定义变量2.2 使用变量 3. 变量的类型4. 为什么要有这么多类型5. 动态类型特性 注释输入输出1. 程序与用户的交互2. 通过控制台输出3. 通过控制台输入 运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. …

Linux文件出现“M-oM-;M-?” ^M 等情况

1、当在编辑linux系统的文件时&#xff0c;会出现如下情况&#xff1a; 解决方法&#xff1a;单个文件可以使用vim 进行修改&#xff0c;shift :&#xff0c; 然后 set nobomb 2、当文件出现每一行末尾^M的情况&#xff1a; 解决方法&#xff1a;使用vi的替换功能。启动vi&am…

vue使用swiper轮播组件开启loop模式点击不了问题处理

1.原本在这里的点击事件换成 :data-href"func_str(item)" 2.在methods里面写好方法 func_str(item){ return JSON.stringify(item); } 3.在原本的调用调用轮播图方法里面加入点击事件 onClick:function(swiper){ var item JSON.parse(swiper.clickedSlide.attrib…

随手笔记(四十五)——idea git冲突

图片为引用&#xff0c;在一次导入项目至gitee的过程中&#xff0c;不知道为什么报了403&#xff0c;很奇怪的一个错误&#xff0c;网上很多的答案大概分成两种。 第一种是最多的&#xff0c;直接找到windows凭据删掉 很抱歉的告诉各位&#xff0c;你们很多人到这里就已经解…

相机HAL

相机HAL 1、概览实现 HAL2、相机 HAL2.1 AIDL 相机 HAL2.2 相机 HAL3 功能2.3 Camera HAL1 概览 相机 HAL 相机 实现 HAL android12-release 1、概览实现 HAL HAL 位于 相机驱动程序 和 更高级别的 Android 框架 之间&#xff0c;它定义您必须实现的接口&#xff0c;以便应用…

php高级 TP+Redis实现发布订阅和消息推送案例实战

Redis 的发布-订阅模型是一种消息通信模式&#xff0c;它允许客户端之间通过特定的频道进行通信。在这种模型中&#xff0c;有些客户端负责发布消息&#xff08;发布者&#xff09;&#xff0c;而其他客户端则订阅它们感兴趣的频道并接收这些消息&#xff08;订阅者&#xff09…

机器学习入门与实践:从原理到代码

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在本文中&#xff0c;我…

fork的一些打印题

1. 代码&#xff1a; #include<sys/types.h> #include<stdio.h>int main() {int remaining 4;int child_pid;while(remaining > 0){child_pid fork();if(child_pid 0) break;remaining--;}printf("P");wait();return 0; }结果&#xff1a; &…

Solidity 小白教程:21. 调用其他合约

Solidity 小白教程&#xff1a;21. 调用其他合约 调用已部署合约 开发者写智能合约来调用其他合约&#xff0c;这让以太坊网络上的程序可以复用&#xff0c;从而建立繁荣的生态。很多web3项目依赖于调用其他合约&#xff0c;比如收益农场&#xff08;yield farming&#xff0…

企业架构LNMP学习笔记48

数据结构类型操作&#xff1a; 数据结构&#xff1a;存储数据的方式 数据类型 算法&#xff1a;取数据的方式&#xff0c;代码就把数据进行组合&#xff0c;计算、存储、取出。 排序算法&#xff1a;冒泡排序、堆排序 二分。 key&#xff1a; key的命名规则不同于一般语言…

每日一题9.17打家劫舍2

213. 打家劫舍213. 提示 中等 1.5K 相关企业 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连…

实时云渲染技术,元宇宙应用的核心之一

1. 元宇宙介绍 元宇宙&#xff08;Metaverse&#xff09;是一种电子世界的概念&#xff0c;它是一个由计算机生成的虚拟世界&#xff0c;允许用户在其中进行交互和体验虚拟生活。元宇宙的设计目的是创造一个与现实世界相似的体验&#xff0c;用户可以通过计算机图形或其他技术…

GitHub平台 Bookget操作

以bookget为例&#xff0c;熟悉github平台。 https://github.com/deweizhu/bookget 选择该界面中的“Wiki”&#xff0c;右侧边栏中是文章的结构大纲。 下载bookget软件。 依照说明&#xff0c;安装bookget环境。

Layui + Flask | 基础使用(样式篇)(02)

关于 layui 提供了封装的样式以及大量的组件,对于基础样式,官方文档的介绍也十分详细,想要学习的可以看一下官方文档,接下来就介绍一下我认为比较重要的基础样式以及注意点。 布局 布局容器 1、固定宽度 将栅格放入一个带有 class="layui-container" 的特定的容器…

Postman常见问题及解决方法

1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xff1a; 检查网络连接是否正常&#xff0c;包括检查网络设置、代理设置等。 确认请求的URL是否正确&#xff0c;并检查是否使用了正确的HTTP方法&#xff08;例如GET、POST、PUT等&…

【DevOps核心理念基础】1. 什么是 devops

一、什么 devops? 1.1 定义 1.2 作用 1.3 核心 1.4. 软件开发流程 1.5. DevOps的核心定义 1.6. 具备的能力 二、DevOps流程中的几个关键概念 2.1 持续集成 2.2 持续交付 2.3 持续部署 2.4 总结 三、DevOps和敏捷开发的演进 一、什么 devops? 1.1 定义 Developme…