LINUX.ORG.RU

Отладчик Go в podman/docker image

 , , ,


0

2

Имеется некоторый сервис, написанный на Go и запускаемый в kubernetes из podman image. Необходимо его удалённо отладить и для этого в этот podman image, помимо самого сервиса, копируется ещё и отладчик dlv. Копируется из $HOME/go/bin в локальной Федоре. Изначально Dockerfile начинался строчкой FROM scratch и для запуска самого сервиса этого было достаточно. Однако dlv в таком окружении не хочет запускаться и при этом в консоле пода печатается сообщение о том, что /dlv not found. Если scratch заменить каким либо полноценным линуксом, например основанным на Убунте имедже Go, то dlv начинается работать.

Очевидно, что в первом случае отладчику не хватает каких-то библиотек. Однако тащить из-за этого почти триста мегабайт какой-то Убунты совсем не хочется. Существует ли другой путь или более мелкий базовый имидж? Alpine не предлагать, там этот dlv не работает. Скорее всего из-за другой реализации libc

Собирать статически слинкованный dlv отдельно для удалённой отладки раз в пол года как-то тоже не хочется. А может существует официальная статически слинкованная сборка? Я пока не нашёл.

Вот внешние библиотеки dlv из Федоры, установленного банальным go install ...

$ ldd ~/go/bin/dlv 
	linux-vdso.so.1 (0x00007f21b8162000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f21b8131000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f21b7f3d000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f21b8164000)


Последнее исправление: zg (всего исправлений: 1)

А что мешает раз в полгода юзать образ с полноценным линуксом, а остальное время - на основе scratch?

PS: gdb тоже умеет гошный код отлаживать

ergo ★★★
()
Последнее исправление: ergo (всего исправлений: 1)

Собирать статически слинкованный dlv отдельно для удалённой отладки раз в пол года как-то тоже не хочется. А может существует официальная статически слинкованная сборка?

А в чем проблема то собрать?

CGO_ENABLED=0 go get -ldflags "-s -w -extldflags '-static'" github.com/go-delve/delve/cmd/dlv

И будет у тебя статичный бинарник.

adn ★★★★
()
Ответ на: комментарий от adn

Странный вопрос. Где всегда. В $GOPATH/bin

Там его нет.

https://go.dev/doc/go-get-install-deprecation

Starting in Go 1.17, installing executables with go get is deprecated. go install may be used instead.

In Go 1.18, go get will no longer build packages; it will only be used to add, update, or remove dependencies in go.mod. Specifically, go get will always act as if the -d flag were enabled. … go get’s ability to build and install commands is now deprecated, since that functionality is redundant with go install. Removing this functionality will make go get faster, since it won’t compile or link packages by default. go get also won’t report an error when updating a package that can’t be built for the current platform.

Ну а go install приносит не мной собранный бинарник, разумеется не статически слинкованный.

zg
() автор топика