В нашем недавнем конкурсе мы получили много отличных работ, чтобы найти лучший совет, позволяющий максимально использовать облачные сервисы Alibaba . Для наших судей было забавно, но сложно выбрать победителей среди множества полезных и интересных работ. Но, увы, после огненных размышлений и жарких споров они решили, что третий приз конкурса достается Дэвиду Банхэму. Его победная статья — краткое руководство по статической компиляции программы Go и использованию Docker для ее контейнеризации и распространения.
Контейнерная служба Alibaba Cloud является отличным примером того, как Docker и Kubernetes революционизируют облачный ландшафт. Придурки заявят, что это все еще какое-то программное обеспечение, работающее на чужом компьютере, но преобразующее отличие состоит в том, что k8s и Docker предоставляют то, что фактически является API-интерфейсом, независимым от платформы. Если вы строите свои конвейеры DevOps для k8s, у вас будет минимальное трение между AWS, Google Cloud, Azure и Alibaba. Чем ближе мы сможем достичь мечты написать один раз, бежать куда угодно, тем лучше!
Еще один инструмент, который я люблю для улучшения переносимости программного обеспечения, — это язык Go. Кросс-компиляция в Go так же проста, как падение с бревна. Я разрабатываю программное обеспечение на своем ноутбуке с Linux, и в мгновение ока я могу создать двоичные файлы для Windows, OSX, WASM и т. Д.! Вот фрагмент Makefile, который я использую для этого:
name = demo
PLATFORMS := linux/amd64 windows/amd64 linux/arm darwin/amd64
temp = $(subst /, ,$@)
os = $(word 1, $(temp))
arch = $(word 2, $(temp))
release:
make -l inner_release
inner_release: $(PLATFORMS)
$(PLATFORMS):
@-mkdir -p ../web/api/clients/$(os)-$(arch)
@-rm ../web/api/clients/$(os)-$(arch)/*
GOOS=$(os) GOARCH=$(arch) go build -o '../web/api/clients/$(os)-$(arch)/$(name) .
@chmod +x ../web/api/clients/$(os)-$(arch)/$(name)
@if [ $(os) = windows ]; then mv ../web/api/clients/$(os)-$(arch)/$(name) ../web/api/clients/$(os)-$(arch)/$(name).exe; fi
zip --junk-paths ../web/api/clients/$(os)-$(arch)/$(name)$(os)-$(arch).zip ../web/api/clients/$(os)-$(arch)/*
@if [ $(os) = windows ]; then cp ../web/api/clients/$(os)-$(arch)/$(name).exe ../web/api/clients/$(os)-$(arch)/$(name); fi
Ухоженная! Это позволит вам получить небольшой аккуратный двоичный файл, который будет работать на ваших целевых операционных системах. Даже это излишне, если вы ориентируетесь на хост Docker, такой как Cloud Container Service. Все, что вам нужно сделать, это просто GOOS=linux GOARCH=amd64 go build
Затем вам просто нужно выбрать ваш любимый дистрибутив Linux и встроить его в Dockerfile.
Что если мы хотим упростить нашу жизнь еще дальше? Что если бы мы могли полностью отказаться от дистрибутива Linux?
Go поддерживает компиляцию статически связанных двоичных файлов. Это означает, что мы можем написать код, который вообще не зависит от каких-либо внешних DLL. Посмотрите на этот волшебный Dockerfile:
FROM scratch
ADD ./bin/web /app
ENTRYPOINT ["/app"]
Что такое царапина? Ничего. Это говорит Docker о том, чтобы связывать ничего, кроме ядра Linux и простых костей, необходимых для работы Docker. Меньше, чем Ubuntu? Там альпийский. Меньше, чем альпийский? Там царапина
Что круче, чем быть альпийцем? Ледяной! Ну, ну ну Хорошо, хорошо, хорошо, хорошо.
Преимущество этого состоит в том, что мы удаляем целый ряд движущихся частей из нашего развертывания. Нет никаких шансов, что решение сопровождающих дистрибутивов объединить или не связать какой-либо сервис в своем дистрибутиве разрушит вашу производственную среду. В коде дистрибутива нет брешей в безопасности. Нет обновлений для управления. Там просто … ничего.
В качестве бонуса вы получаете крошечное изображение Docker, которое легче отгружать. Проще отправлять в любое понравившееся вам облако!
Дать ему шанс. Напишите немного Go, статически скомпилируйте его и поместите в пустой контейнер Docker. Разверните его на Alibaba, AWS и Google Cloud просто для удовольствия! Посмотрите, какой сервис подходит вам лучше всего.