предисловие
Во-первых, сам 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
Виртуальная машина имеет ту же цель. Извлекая образ и создавая экземпляр контейнера, вы также можете избежать проблем с настройкой среды выполнения на новой машине каждый раз. Я новичок и все еще учусь, поэтому если есть какие-то ошибки или упущения, надеюсь меня поправят, спасибо!