Выполнение команд оболочки внутри контейнерного приложения Go.

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

Введение

Я создам приложение Go, которое может выполнять в нем команды оболочки, а затем я контейнеризирую приложение с помощью Docker. Если вы не знакомы с Golang, вы можете использовать код, который я предоставил ниже, и вы не должны придерживаться того же процесса и кода, который я здесь описываю.

Давайте начнем.

Установите необходимое программное обеспечение

Прежде чем создавать приложение Go, давайте настроим среду для разработки.

В основном вам нужно установить Docker на свой компьютер, и если вы уже установили Docker на свой компьютер, вы можете сразу перейти к следующему шагу. Или же используйте ссылку ниже, чтобы загрузить его на свой компьютер.



Затем вам понадобится текстовый редактор для создания всех файлов конфигурации для этого проекта. Я предпочитаю VS Code, поэтому в этом уроке я буду использовать его. Но вы можете использовать любой из ваших любимых текстовых редакторов, а если вам нужно скачать VS Code, воспользуйтесь ссылкой ниже.



Создайте приложение Go

Если вы хорошо разбираетесь в языке программирования Golang, то написать программу на Go для вас не составит труда. В обычных сценариях перед написанием приложения Go вам необходимо установить Go на свой компьютер.

Но в этом руководстве мы должны создать приложение Go внутри контейнера Docker; чтобы мы могли использовать официальный образ докера Golang вместо ручной установки Golang.

Давайте создадим наше приложение Go, и для демонстрационных целей я создам базовое приложение Go, которое показывает ответ в браузере. Вы можете изменить это позже, чтобы получить другие результаты.

Здесь команда ls выводит список доступных файлов и каталогов внутри нашего приложения и отображает их в браузере, когда мы запрашиваем через назначенный нами порт.

[Примечание: вы можете использовать разные команды оболочки, такие как pwd, echo, для получения разных выходных данных. Кроме того, вы можете попробовать различные переменные среды, такие как PATH, изменив этот файл Go.]

Создать Dockerfile

Чтобы создать Dockerfile, сначала вам нужно выбрать образ Golang Docker с тегом. Перейдите по ссылке ниже и попробуйте выбрать один из тегов, которые вы предпочитаете.



Используя образ докера Golang по приведенной выше ссылке, мы можем создать наш Dockerfile. В Dockerfile вы можете изменять команды в соответствии с вашим сценарием, и здесь я даю вам базовый файл конфигурации со всеми необходимыми командами для создания нашего конкретного образа Docker.

Теперь наше приложение Go и Dockerfile готовы. Давайте создадим наш образ и запустим контейнер, используя этот образ, чтобы проверить, видим ли мы ответ в браузере.

Обновление. Если у вас возникла ошибка при создании образа Docker с использованием вышеуказанного Dockerfile, попробуйте вместо этого приведенный ниже фрагмент кода.

FROM golang:alpine
WORKDIR /go/src/app
COPY . /go/src/app
RUN go mod init
RUN go build -o /go/usr/app .
EXPOSE 8080
CMD ["/go/usr/app"]

Создайте образ докера

Когда все наши файлы будут готовы, мы можем приступить к созданию образа приложения Go. Откройте терминал, измените каталог на приложение Go и выполните приведенную ниже команду, чтобы создать образ докера.

$ docker build . -t go-app

docker build — это команда, которую мы используем для создания образа докера, а флаги . и -t представляют текущий каталог и имя вашего образа. В моем случае go-app — это имя образа докера, и, используя флаг -t, вы даже можете добавить тег к своему образу докера, как показано ниже.

$ docker build . -t go-app:1.0

После успешного выполнения всех шагов, которые вы упомянули в Dockerfile, вы можете запустить docker images на своем терминале, чтобы проверить, успешно ли создан ваш образ Docker. Если вы добавили тег для своего изображения при его создании, вы также увидите этот тег в выводе docker images.

Если ваше приложение go-app:1.0 есть в списке, вы можете перейти к следующему шагу — созданию контейнера Docker с использованием этого образа.

Создайте контейнер Docker

Вы можете создать док-контейнер, используя приведенную ниже команду на своем терминале.

$ docker run -p 8080:8000 --name go-c1 go-app:1.0

docker run — это команда, которую мы используем для создания контейнера из образа докера. В приведенной выше команде мы использовали флаг -p для экспорта портов для нашего контейнера. В команде -p 8080:8000 порт 8080 — это наш локальный порт, а порт 8000 — это порт, на котором работает наш контейнер.

Кроме того, вы можете использовать флаг —- name для установки имени контейнера, и в этом случае go-c1 — это имя контейнера, а в конце имени контейнера необходимо указать имя образа docker, которое вы использовали для создания контейнера docker.
После успешного выполнения команды docker run вы можете вывести список всех запущенных контейнеров с помощью команды docker ps.

[Примечание: используйте другую вкладку вашего терминала для запуска команды docker ps, так как приведенная выше команда не освободит терминал, пока вы не отмените процесс]

Если вы видите свой контейнер в команде docker ps, значит, вы почти закончили разработку.

Проверьте ответ в браузере

Выполнив все вышеперечисленные шаги, вы можете открыть браузер и перейти к localhost:port.

Если вы все еще не уверены в том, какой порт нужно добавить после localhost, вы можете использовать команду docker port, чтобы проверить его, как показано ниже.

$ docker port <container-id>

Получите идентификатор контейнера из команды docker ps и скопируйте его, как показано ниже. Затем вы получите порт, который запускает ваш док-контейнер локально.

$ docker port 329ea194a282
//output
8000/tcp -> 0.0.0.0:8080

Здесь вы можете видеть, что приложение работает на порту 8080 локально, так что откройте браузер и перейдите на localhost:8080, чтобы увидеть ответ.

Заключение

Поздравляем! 🎉
Вы создали приложение Go, которое может выполнять команды оболочки внутри контейнера Docker. Вы можете изменить свое приложение Go в соответствии со своим сценарием и соответственно попробовать разные результаты.

Спасибо за чтение!