최근에 Docker 와 Go 언어에 완저히 반해 버렸습니다. 


GO 언어는 하루만에 대충 사용할 수 있을 정도로 쉽고 ( Interface 란 개념만 빼고.. )


안되는 것이 없을 정도로 막강한 패키지 시스템 


뭐 한마디로 죽입니다. ^^


제가 보기에는 게으른 개발자를 위한 언어입니다.  ^^


극찬하고 싶어요.. 


Go 언어는 크로스 컴파일도 됩니다. 


임베디드용으로 정말 권장하고 싶은 언어죠..


그래서 도커용으로 컴파일 환경 이미지를 만들었습니다. 



다음은 제가 만들면서 기록한 내용입니다. 도움이 되시길..


아! 이거 armv5 용입니다. 이거 cortex 용으로 하실려면 Dockerfile 에서 다음 항목을 수정하셔야 합니다.


GOARM="5"


       GOARM="7"

로 바꾸셔야 합니다.

다음 위치에서 작업 한다. 


서버 : 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