Docker Training (6 серии деталей)
Цель этого проекта — не научиться строить API в Голанге или что -то еще. Если вы хотите узнать больше о фрагменте ниже, не стесняйтесь копаться через Идти Док . Теперь давайте создадим файлы и начнем.
Чтобы начать, нам нужно создать проект для хранения нашего приложения, с которым мы будем работать. Создайте следующую структуру. Мы будем продолжать заполнять больше, пока мы пойдем позже.
DockerTraining/ go-rest-api/ main.go dockerfile
Инициализировать папку как проект GO
$ GO111MODULE=on go mod init helloFromIntegratnIO
Добавить следующий код в main.go
package main import ( "fmt" "log" "net/http" "os" ) func helloFromIntegratnIO(w http.ResponseWriter, r *http.Request) { message := "Hello From Integratn.IO" if m := os.Getenv("MESSAGE"); m != "" { message = m } fmt.Fprintf(w, "%s\n", message) fmt.Println("Endpoint Hit: helloFromIntegratnIO") } func handleRequests() { http.HandleFunc("/", helloFromIntegratnIO) log.Fatal(http.ListenAndServe(":10000", nil)) } func main() { fmt.Println("Starting Web Server") fmt.Println("Preparing to handle requests") fmt.Println("Ready for requests") handleRequests() }
Там не так много. Мы создаем авторитет ответов, который печатает немного текста, когда вы попадаете в приложение на порту 10000.
Давайте заполним наш Dockerfile.
FROM golang:alpine # Keep older versions of Go behaving the same as the latest ENV GO111MODULE=on \ CGO_ENABLED=1 # Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache git WORKDIR $GOPATH/src/integratnio/go-rest-api/ COPY go-rest-api . # Fetch dependencies. # Using go get. RUN go get -d -v # Build the binary. RUN go build -o /go/bin/hello ENTRYPOINT ["/go/bin/hello"]
Выглядит знакомо, верно?
Давайте пройдемся через это еще раз. Мы объявили наше базовое изображение с От инструкция Тогда мы используем Запустить инструкция по установке git. Используется Workdir Чтобы изменить путь, над которым мы работаем. Скопировано в нашем коде с Копия инструкция Использовал БЕЖАТЬ Снова командуйте, чтобы получить любые возможные зависимости, которые были необходимы для нашей программы. Еще одно последнее использование Запустить Чтобы построить наше приложение в исполняемый файл. Тогда наконец мы объявили наш Intrypoint с последней инструкцией, указывающей на то, где находится наше приложение.
Теперь мы готовы, наконец, пройти через сборку. Давайте выпустим нашу первую команду Docker.
Запустить $ Docker Build. -t Hellofromintegratnio
Давайте посмотрим на вывод.
✭ ᐅ docker build . -t helloFromIntegratnIO Sending build context to Docker daemon 84.48kB Step 1/7 : FROM golang:alpine alpine: Pulling from library/golang 596ba82af5aa: Pull complete 344f2904b0c6: Pull complete d3bda26d9fa1: Pull complete 24e1a14bb4a2: Pull complete f0b175b107d5: Pull complete Digest: sha256:07ec52ea1063aa6ca02034af5805aaae77d3d4144cced4e95f09d62a6d8ddf0a Status: Downloaded newer image for golang:alpine ---> 6af5835b113c Step 2/7 : RUN apk update && apk add --no-cache git ---> Running in db684e4aab79 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz v3.13.0-114-g822507f819 [https://dl-cdn.alpinelinux.org/alpine/v3.13/main] v3.13.0-115-g41ee0c8f55 [https://dl-cdn.alpinelinux.org/alpine/v3.13/community] OK: 13880 distinct packages available fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz (1/6) Installing brotli-libs (1.0.9-r3) (2/6) Installing nghttp2-libs (1.42.0-r1) (3/6) Installing libcurl (7.74.0-r0) (4/6) Installing expat (2.2.10-r1) (5/6) Installing pcre2 (10.36-r0) (6/6) Installing git (2.30.0-r0) Executing busybox-1.32.1-r0.trigger OK: 19 MiB in 21 packages Removing intermediate container db684e4aab79 ---> 80212a0a3d3b Step 3/7 : WORKDIR $GOPATH/src/mypackage/myapp/ ---> Running in 60c0c79d0d5c Removing intermediate container 60c0c79d0d5c ---> 29ab2f51aa11 Step 4/7 : COPY go-rest-api . ---> 7ded2d7874e0 Step 5/7 : RUN go get -d -v ---> Running in da6e8b285779 Removing intermediate container da6e8b285779 ---> f7eb2d97bd6f Step 6/7 : RUN go build -o /go/bin/hello ---> Running in 0e503ced7243 Removing intermediate container 0e503ced7243 ---> 21bbd2acaf3c Step 7/7 : ENTRYPOINT ["/go/bin/hello"] ---> Running in 42165a2c670f Removing intermediate container 42165a2c670f ---> 86fd2d2eb271 Successfully built 86fd2d2eb271 Successfully tagged helloFromIntegratnIO:latest
Так что здесь происходит?
Шаг 1/7: наш От Инструкция потребляется, и мы видим, что она получает все слои, необходимые для создания нашего базового изображения.
Шаг 2/7: Запустить выполняет, и есть несколько нормальных Apt
вывод, пока он устанавливает GIT и необходимые зависимости.
Шаг 3/7: мы видим Workdir Установите наш новый путь, в котором мы работаем.
Шаг 4/7: Копия Втягивает наш исходный код в изображение.
Шаг 5/7: Запустить использует исполняемый файл GO для получения зависимостей для нашего приложения. Что -то, чтобы заметить здесь. Мы никогда не устанавливались локально. Все это работает в контейнере сборки. Пока базовое изображение, с которого вы работаете, имеет двоичный, который вам нужен, или вы добавляете его в контейнер, как. Вы можете запустить все, что вам нужно в контейнере, не беспокоясь о чем -то локально на вашей машине.
Шаг 6/7 Запустить Использует исполняемый файл GO для создания приложения.
Шаг 7/7 Intrypoint объявляет, что начать с контейнера.
Изображение построено. Но куда это ушло? Давайте используем Docker Image LS
найти Это
ᐅ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE helloFromIntegratnIO latest dee090a053a3 About an hour ago 321MB
Вот как этот вывод разрушается:
Репозиторий: Имя, которое мы дали наше изображение.
Тег: Последний
всегда самая недавно созданная версия изображения.
Идентификатор изображения: это уникальный хэш, который идентифицирует наше изображение
Создано: как давно Изображение было создано
РАЗМЕР: Размер нашего изображения.
Давайте возьмем быструю секунду и поговорим о тегах. Теги важны. Это отличный способ ссылаться на то, какую версию нашего изображения работает. Они помогают нам быть декларативными в том, что мы работаем в любой среде. Итак, давайте создадим приложение с фактическим тегом вместо последнего.
ᐅ docker build . -t helloFromIntegratnIO:dev Sending build context to Docker daemon 100.9kB Step 1/7 : FROM golang:alpine ---> 6af5835b113c Step 2/7 : RUN apk update && apk add --no-cache git ---> Using cache ---> 80212a0a3d3b Step 3/7 : WORKDIR $GOPATH/src/integratnio/go-rest-api/ ---> Using cache ---> 75eb0766eb86 Step 4/7 : COPY go-rest-api . ---> Using cache ---> 9ea13e96b401 Step 5/7 : RUN go get -d -v ---> Using cache ---> cf8a5cf85856 Step 6/7 : RUN go build -o /go/bin/hello ---> Using cache ---> e4e107828679 Step 7/7 : ENTRYPOINT ["/go/bin/hello"] ---> Using cache ---> dee090a053a3 Successfully built dee090a053a3 Successfully tagged helloFromIntegratnIO:dev
Подожди секунду. Этот вывод выглядит по -разному. Что случилось?
Вот одно из преимуществ Docker. Ваш кэш Docker поддерживает историю ваших изображений и слоев, используемых для создания этих изображений. Если ваш DockerFile и ваш код не изменились, он будет использовать кэшированное изображение для создания этого уровня. Поскольку все, что мы делали, это повторно преодолели изображение, он только что потреблял кэш вниз.
Давайте снова посмотрим на наши изображения.
/Volumes/CaseSensitive/docker-training (main ✘)✹ ᐅ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE helloFromIntegratnIO dev dee090a053a3 About an hour ago 321MB helloFromIntegratnIO latest dee090a053a3 About an hour ago 321MB86fd2d2eb271 About an hour ago 321MB
Итак, у нас есть девчонка
тег, которую мы только что создали. Но давайте посмотрим на Идентификатор изображения
Анкет Dev
ярлык и Последний
тег имеет одинаковое Идентификатор изображения
. Это то, что мы хотим, потому что это самое недавно созданное изображение.
Так что это такое
изображение? Если вы прокрутите вверх. Вы увидите, что
соответствует Идентификатор изображения
от нашей первой сборки. Это показывает вам, что происходит, когда вы не помечаете свои изображения. Если вы создали другое изображение, используя Dev
ярлык. То же самое произойдет с этим изображением. Но это локальное тестирование, а не выпуск производства. Так что нет большого значения.
Docker Training (6 серии деталей)
Оригинал: «https://dev.to/jamesatintegratnio/docker-training-2-my-first-docker-build-3d6d»