Ако не сте експерт по Docker, като повечето хора, най-добрият възможен начин да научите е да стартирате терминал и да се забърквате в празен контейнер. Един пример е да отворите изображение на Ubuntu, да инсталирате python и да напишете емблематичния скрипт „Hello World“. Правейки всичко това в изображението на Ubuntu, Docker ще започне да има смисъл.

Това е забавният начин да научите Docker: Започнете от базово изображение и отвътре инсталирайте всички необходими зависимости, за да накарате програмата си да работи.

История

Да кажем, че имате просто приложение Golang, което импортира други Go файлове. Както се очаква, винаги ще импортираме Go файлове чрез оператора за импортиране по отношение на нашия набор GOPATH:

github.com/keithkfield/pg_api/lp_routes

С импортирания пакет от бази данни можем лесно да импортираме експортируеми функции. Тук ще дефинирам маршрут за добавяне на поръчки към базата данни (Postgres):

http.HandleFunc(“/order”, lp_routes.AddOrder)

С това създадено основно приложение е време да го поставим в Dockerfile, така че можем лесно да гарантираме, че всеки, който клонира моето репо, може да стартира сървъра без грешки в зависимостите.

За такова лесно приложение като това, простият Dockerfile просто ще стартира изображението на Golang, ще копира съдържанието на директорията в контейнера и след това ще стартира go run main.go. Много езици не се тревожат за това къде поставяме нашата работна директория. Както Javascript, така и Python могат да изпълняват основния файл където решим, обикновено просто поставяме всички наши файлове в произволна директория „/app“. Така че идването от други езици ще ни навреди е създаването на успешен Dockerfile за приложения на Golang.

Бързо: Golang Dockerfile се различава от другите езици, тъй като поставянето на целия код в произволна директория няма да позволи на приложението ви да импортира правилно други Go пакети. За да коригираме този проблем, трябва да поставим целия си код в новосъздадения GOPATH —

WORKDIR github.com/keithkfield/pg_api

Начинът, по който разбрах това, беше като играх с празен контейнер на Golang. Командата Docker е -

docker run -dit — име dev golang

Флагът -d позволява на контейнера да работи във фонов режим, -това е така, че винаги има активен интерактивен терминал, защото ако тези флагове не са били извикани, празният контейнер просто ще спре. Нарекохме и този нов контейнер dev. За да играем активно в този контейнер, се нуждаем от командата —

docker exec -it dev bash

Това ни позволява да влезем в контейнера и да работим в неговата файлова система. Отново, това е извън терминала.

Успях да реша проблема с моите файлове, които не могат да намерят друг файл, като изпълних командата „echo $GOPATH“, която върна простото „/go“. Въпреки че това беше очевиден факт от go приложенията, този проблем ме спъваше седмици наред. По погрешка импортирах всичките си файлове извън GOPATH, така че файловете ми не можаха да бъдат намерени и компилирани.

От вътрешността на контейнера е доста лесно да се използва мениджърът на пакети на linux (yum, apt-get и т.н.), за да инсталирате необходимите пакети. След като сте в състояние да стартирате програмата си в този контейнер на пясъчника, последната задача е просто да преброите всичките си стъпки в Dockerfile. Въпреки че този Dockerfile не е направен с оглед на ефективността, той служи като основен скрипт, за да стартирате програмата си и оставя място за извършване на ефективни промени, които могат драстично да намалят размера на изображението.