GoLang과 Python 빌드가 모두 가능한 docker 이미지 만들기
상황에 따라 Go 언어와 Python 언어가 함께 빌드되는 환경이 필요할 수 있습니다. ^^ 이런 경우, 둘 중의 하나는 간단하게 FROM 지시자를 통해 기본 이미지를 선택할 수 있습니다. 여기서는 파이썬 기반으로 예제를 진행해 보겠습니다.
FROM python:3.8-slim-buster
...[생략]...
그럼 저 한 줄로 인해 파이썬 빌드 환경은 해결이 됩니다. 이후, golang을 빌드하기 위해 "apt install" 명령어를 추가했는데,
FROM python:3.8-slim-buster
...[생략]...
RUN apt install golang -y
...[생략]...
아쉽게도 근래의 소스 코드 빌드 시 이런 오류가 발생합니다.
testprj/main.go:161:7: undefined: errors.As
note: module requires Go 1.13 error occurred
실제로 기본 설치된 go 버전은 1.11.6이었습니다.
# go version
go version go1.11.6 linux/amd64
기준으로 한 "python:3.8-slim-buster" 이미지가 채택한 운영체제는 데비안 10인데,
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
명성에 걸맞게 매우 오래된 golang을 기본 설치 버전으로 제공하는군요. ^^; 이에 대해 검색해 보면 수작업으로 설치하는 것도 나옵니다.
How To Install Go 1.16 on Debian 10/9/8
; https://tecadmin.net/install-go-on-debian/
$ sudo apt remove 'golang-*' -y
$ sudo apt install wget
$ wget https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
$ tar -xvf go1.16.4.linux-amd64.tar.gz
$ sudo mv go /usr/local
$ export GOROOT=/usr/local/go
$ export PATH=$GOROOT/bin:$PATH
$ go version
go version go1.13.9 linux/amd64
참고로, 만약 데비안이 아닌 우분투가 기본 이미지였다면 별도의 repo를 등록해 설치하는 방법이 있습니다.
How to install the current version of Go in Ubuntu Precise
; https://stackoverflow.com/questions/17480044/how-to-install-the-current-version-of-go-in-ubuntu-precise/33113694
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang-go
따라서 "python:3.8-slim-buster" 이미지를 위한 dockerfile에는 다음과 같은 식으로 명령어를 구성하면 됩니다.
FROM python:3.8-slim-buster
...[생략]...
RUN apt update
RUN apt upgrade -y
RUN apt install wget -y
RUN wget https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
RUN tar -xvf go1.16.4.linux-amd64.tar.gz
RUN mv go /usr/local
ENV GOROOT=/usr/local/go
ENV PATH=$GOROOT/bin:$PATH
하지만, 저렇게 하면 시간이 꽤나 오래 걸리고, wget/tar/mv 단계는 "CACHED"를 거치지 않기 때문에 다시 이미지를 만드는 경우에도 시간을 잡아먹게 됩니다.
이를 보완하려면 "
Multi-stage build"를 사용하는 것이 더 좋습니다. 즉, go를 위한 이미지를 경유하는 것입니다.
# syntax=docker/dockerfile:1
FROM golang:latest as go_builder
FROM python:3.8-slim-buster
...[생략]...
COPY --from=go_builder /usr/local/go /usr/local/go
ENV GOROOT=/usr/local/go
ENV PATH=$GOROOT/bin:$PATH
저렇게 간단하게 두 줄의 명령어만 추가해 주면 golang, python 빌드가 모두 가능한 이미지가 만들어집니다. ^^
c:\temp> docker run ...[생략]...
# go version
go version go1.17.5 linux/amd64
# python --version
Python 3.8.12
혹은, 누군가 올려놓은 GoLang + Python 이미지가 있을 텐데 그걸 쓰셔도 무방합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]