Кросс-компиляция Golang на основе Docker

Go

предисловие

Во-первых, сам Go очень силен в методе кросс-компиляции, поэтому я не буду здесь вдаваться в подробности, студенты, которым это нужно, могут обратиться к нему.«Кросс-компиляция исполняемых файлов Golang для различных платформ». Хотя встроенная кросс-компиляция достаточно мощная и может удовлетворить большинство сценариев использования, все же есть ловушка: когда код CGO включен в исходный код, кросс-компиляция по умолчанию пойдет не так.«Влияние переменной среды CGO_ENABLED на механизм статической компиляции Go». По сути, есть способ построения проекта, который можно решить раз и навсегда и обеспечить согласованность офлайн-компиляции со средой онлайн-развертывания, то есть «решение для кросс-компиляции» на основе Docker.

Docker — очень популярная в последние годы технология контейнеризации Linux.По сравнению с традиционной технологией виртуальных машин, Docker занимает меньше системных ресурсов, меньше по размеру и имеет очень высокую скорость запуска. В то же время Docker можно быстро собрать на основных операционных системах Windows, macOS и Linux, что очень важно для кросс-компиляции, описанной в этой статье. Подробное знакомство с контейнером см.Руководство по началу работы с Docker,Тотспособ установкиТоже очень просто.

метод

Подготовьте базовое изображение

Для того, чтобы обеспечить эффект одной компиляции и запуска везде (что-то похожее на виртуальную машину JAVA), необходимо использовать один и тот же базовый образ Docker для компиляции кода и деплоя соответственно.Эта статья основана на официальном релизе DockerHub.golang:1.14.3-stretchПодгонял образ, что более удобно для компиляции и экспорта кода проекта.Объем образа около 280мб, что более приемлемо. Вот Dockerfile для образа:

FROM golang:1.14.3-stretch
MAINTAINER author <email@xxx.com>

RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    wget \
    vim \
    htop \
    curl \
    sudo \
    git \
    net-tools \
    tzdata \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && rm -rf /var/lib/apt/lists/*

ENV GOBIN=$GOPATH/bin
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.io,direct
ENV TZ=Asia/Shanghai

WORKDIR $GOPATH/src/app

ENTRYPOINT ["go", "build"]

p.s. 以上镜像的Golang环境默认开启GOMODULE模式,因此为保证能顺利编译,项目需要初始化go.mod

как пользоваться

с вышеуказаннымDockerfile, а затем мы можем быстро создать образ и создать экземпляр соответствующего контейнера, чтобы завершить компиляцию и развертывание исходного кода проекта. Конкретные шаги заключаются в следующем:

1. Создайте образ
    # 在Dockerfile所处当前目录下,执行
    ~$ docker build -t gobuilder:1.14.3-stretch .
2. Скомпилируйте исходный код вашего проекта
    # 假设你的项目目录gosrc包含以下文件:
    /abspath/gosrc
               |---package
               |      |---func1.go
               |      |---func2.go
               |---go.mod
               |---config.yml
               |---main.go
            
    # 运行以下容器编译你的go项目并导出可执行文件到当前目录下
    ~$ docker run --rm -it -v /abspath/gosrc/:/go/src/app gobuilder
3. Запустите свой проект

Здесь есть два способа запустить проект go напрямую:
ПервоеКак только что было сказано, вы можете запустить свое приложение, сначала скомпилировав, а затем выполнив экспортированный исполняемый файл. Если он развернут в сети, его также можно зеркально отразить.gobuilderможно специально для васmainИсполняемые файлы написаны специфичноDockerfileОн используется для построения и создания экземпляра образа приложения. Для получения подробной информации см. следующие методы построения:

    FROM gobuilder:1.14.3-stretch
    MAINTAINER author <email@xxx.com>
    WORKDIR /app
    COPY . .
    RUN chmod 777 main
    # master process
    ENTRYPOINT ["./main"]  

секундасостоит в том, чтобы принятьgo runзапустите свой файл go напрямую и запустите процесс приложения в видеgobuilderЗеркало, просто смонтируйте проект и измените его при запускеENTRYPOINTиCMDпараметры, пожалуйста, обратитесь к следующим командам для деталей:

# 如果需要容器应用后台运行,只需将-it改成-d即可
~$ docker run --name YourAppName -it -v /abspath/gosrc/:/go/src/app --entrypoint go gobuilder run main.go

Суммировать

Эта статья в основном знакомит сDockerСкомпилируйте и запустите метод приложения, который можно использовать в любом (Linux, macOSиWindows) установлен сDockerСогласованное развертывание достигается на машинах в среде. Он может достичь эффекта компиляции один раз и запускать везде, что очень похожеJAVAВиртуальная машина имеет ту же цель. Извлекая образ и создавая экземпляр контейнера, вы также можете избежать проблем с настройкой среды выполнения на новой машине каждый раз. Я новичок и все еще учусь, поэтому если есть какие-то ошибки или упущения, надеюсь меня поправят, спасибо!