go언어
최근에 Docker 와 Go 언어에 완저히 반해 버렸습니다.
GO 언어는 하루만에 대충 사용할 수 있을 정도로 쉽고 ( Interface 란 개념만 빼고.. )
안되는 것이 없을 정도로 막강한 패키지 시스템
뭐 한마디로 죽입니다. ^^
제가 보기에는 게으른 개발자를 위한 언어입니다. ^^
극찬하고 싶어요..
Go 언어는 크로스 컴파일도 됩니다.
임베디드용으로 정말 권장하고 싶은 언어죠..
그래서 도커용으로 컴파일 환경 이미지를 만들었습니다.
다음은 제가 만들면서 기록한 내용입니다. 도움이 되시길..
아! 이거 armv5 용입니다. 이거 cortex 용으로 하실려면 Dockerfile 에서 다음 항목을 수정하셔야 합니다.
다음 위치에서 작업 한다.
서버 : 192.168.4.37
접속
$ ssh falinux@192.168.4.37
작업 디렉토리 : ~/docker_golang-crosscompile
이동
$ cd ~/docker_golang-crosscompile
다음과 같은 .bash_aliases 파일을 만든다.
=====[.bash_aliases]=====================================
#!/bin/bash
alias go-linux-arm='GOARM="5" GOOS="linux" GOARCH="arm" go'
==================================================
실행 가능하게 퍼미션 조정 (무식하게 하자.. ㅠㅠ )
$ chmod 777 .bash_aliases
다음과 같은 Dockerfile 파일을 작성한다.
=====[Dockerfile]====================================================
FROM ubuntu:14.04
MAINTAINER David You <frog@falinux.com>
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update
RUN apt-get install -y language-pack-ko
# set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
RUN apt-get install -y wget git mercurial build-essential
WORKDIR /usr/local/
RUN git clone https://go.googlesource.com/go
WORKDIR /usr/local/go
RUN git checkout go1.4.1
WORKDIR /usr/local/go/src
RUN ./all.bash
ENV GOROOT=/usr/local/go
ENV PATH=$PATH:$GOROOT/bin/
RUN git clone git://github.com/davecheney/golang-crosscompile.git
RUN cd /usr/local/go/src && bash -xc 'GOARM="5" GOOS="linux" GOARCH="arm" ./make.bash --no-clean 2>&1'
ADD .bash_aliases /root/.bash_aliases
WORKDIR /work/
CMD ["bash"]
=========================================================================
이미지를 빌드 한다.
$ cd ~/docker_golang-crosscompile
$ docker build --tag arm9go:1.0 ./
빌드된 이미지를 확인한다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
arm9go 1.0 490364b13cda About a minute ago 899.2 MB
다음과 같이 컨테이너 실행 스크립트를 만든다.
=====[arm9go.sh]============================================================
#!/bin/bash
docker run --rm -it --privileged --net=host -v $(pwd):/work -v /nfs:/nfs -v /tftpboot:/tftpboot arm9go:1.0
==========================================================================
이 파일의 실행 권한을 다음과 같이 바꾼다.
$ chmod 777 arm9go.sh
다른 사람들도 이용이 가능하도록 다음에 복사한다.
$ sudo cp -a arm9go.sh /usr/bin/
다음과 같은 과정으로 실행 테스트를 해 본다.
소스를 빌드할 디렉토리를 생성한다.
$ mkdir ~/arm9go_test
$ cd ~/arm9go_test
다음과 같이 실행 해 빌드 컨테이너로 진입한다.
$ arm9go.sh
/work#
ARM 용 빌드 시험
시험 테스트 소스
====[hello.go]=============================================
package main
import "fmt"
func main(){
fmt.Println( "hello")
}
========================================================
ARM 빌드
# go-linux-arm build hello.go
# ls -al
합계 1596
drwxrwxr-x 2 1000 1000 4096 3월 9 14:21 .
drwxr-xr-x 58 root root 4096 3월 9 14:21 ..
-rwxr-xr-x 1 root root 1620880 3월 9 14:21 hello
-rw-r--r-- 1 root root 68 3월 9 14:21 hello.go
# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
/nfs 로 보내고 싶다면
# cp hello /nfs
보드에서 다음과 같이 nfs 마운트를 한다.
# mount -t nfs -o nolock 192.168.4.37:/nfs /mnt/nfs
보드에서 다음과 같이 실행해 본다.
# cd /mnt/nfs
# ./hello
hello