성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>GoLang과 Python 빌드가 모두 가능한 docker 이미지 만들기</h1> <p> 상황에 따라 Go 언어와 Python 언어가 함께 빌드되는 환경이 필요할 수 있습니다. ^^ 이런 경우, 둘 중의 하나는 간단하게 FROM 지시자를 통해 기본 이미지를 선택할 수 있습니다. 여기서는 파이썬 기반으로 예제를 진행해 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>FROM python:3.8-slim-buster</span> ...[생략]... </pre> <br /> 그럼 저 한 줄로 인해 파이썬 빌드 환경은 해결이 됩니다. 이후, golang을 빌드하기 위해 "apt install" 명령어를 추가했는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FROM python:3.8-slim-buster ...[생략]... <span style='color: blue; font-weight: bold'>RUN apt install golang -y</span> ...[생략]... </pre> <br /> 아쉽게도 근래의 소스 코드 빌드 시 이런 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > testprj/main.go:161:7: undefined: errors.As note: module requires Go 1.13 error occurred </pre> <br /> 실제로 기본 설치된 go 버전은 1.11.6이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>go version</span> go version go1.11.6 linux/amd64 </pre> <br /> 기준으로 한 "python:3.8-slim-buster" 이미지가 채택한 운영체제는 데비안 10인데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>lsb_release -a</span> No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 10 (buster) Release: 10 Codename: buster </pre> <br /> 명성에 걸맞게 매우 오래된 golang을 기본 설치 버전으로 제공하는군요. ^^; 이에 대해 검색해 보면 수작업으로 설치하는 것도 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How To Install Go 1.16 on Debian 10/9/8 ; <a target='tab' href='https://tecadmin.net/install-go-on-debian/'>https://tecadmin.net/install-go-on-debian/</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ 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 </pre> <br /> 참고로, 만약 데비안이 아닌 우분투가 기본 이미지였다면 별도의 repo를 등록해 설치하는 방법이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to install the current version of Go in Ubuntu Precise ; <a target='tab' href='https://stackoverflow.com/questions/17480044/how-to-install-the-current-version-of-go-in-ubuntu-precise/33113694'>https://stackoverflow.com/questions/17480044/how-to-install-the-current-version-of-go-in-ubuntu-precise/33113694</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ sudo add-apt-repository ppa:longsleep/golang-backports $ sudo apt update $ sudo apt install golang-go </pre> <br /> <hr style='width: 50%' /><br /> <br /> 따라서 "python:3.8-slim-buster" 이미지를 위한 dockerfile에는 다음과 같은 식으로 명령어를 구성하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FROM python:3.8-slim-buster ...[생략]... <span style='color: blue; font-weight: bold'>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</span> </pre> <br /> 하지만, 저렇게 하면 시간이 꽤나 오래 걸리고, wget/tar/mv 단계는 "CACHED"를 거치지 않기 때문에 다시 이미지를 만드는 경우에도 시간을 잡아먹게 됩니다.<br /> <br /> 이를 보완하려면 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12171'>Multi-stage build</a>"를 사용하는 것이 더 좋습니다. 즉, go를 위한 이미지를 경유하는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # syntax=docker/dockerfile:1 <span style='color: blue; font-weight: bold'>FROM golang:latest as go_builder</span> FROM python:3.8-slim-buster ...[생략]... <span style='color: blue; font-weight: bold'>COPY --from=go_builder /usr/local/go /usr/local/go</span> ENV GOROOT=/usr/local/go ENV PATH=$GOROOT/bin:$PATH </pre> <br /> 저렇게 간단하게 두 줄의 명령어만 추가해 주면 golang, python 빌드가 모두 가능한 이미지가 만들어집니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> docker run ...[생략]... # <span style='color: blue; font-weight: bold'>go version</span> go version go1.17.5 linux/amd64 # <span style='color: blue; font-weight: bold'>python --version</span> Python 3.8.12 </pre> <br /> 혹은, 누군가 올려놓은 GoLang + Python 이미지가 있을 텐데 그걸 쓰셔도 무방합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1839
(왼쪽의 숫자를 입력해야 합니다.)