導航:首頁 > 源碼編譯 > docker下能編譯arm嗎

docker下能編譯arm嗎

發布時間:2022-09-11 17:43:14

❶ 如何交叉編譯python到ARM-linux平台

編譯sqlite

先去 http://www.sqlite.org/download.html 下載最新的sqlite源代碼,我這里用的是3.5.6版本的。

我推薦使用amalgamation版本的源代碼,這個代碼只有幾個文件而已,編譯起來方便,而且據說 編譯器好的話,還可能編譯出更高效的代碼。 我下載的是

[plain]
view plain

http://www.sqlite.org/sqlite-amalgamation-3.5.6.tar.gz

先運行以下幾步:

[plain]
view plain

tar zxf sqlite-amalgamation-3.5.6.tar.gz
cd sqlite-3.5.6
./configure --host=arm-linux --prefix=/usr/local/arm/3.3.2 --enable-shared --disable-readline --disable-dynamic-extensions

以上是把sqlite解壓縮,然後做一些配置,這里,我希望sqlite到時候安裝到/usr/local/arm/3.3.2里,要生成動態鏈接庫,不要readline,不要sqlite的動態擴展。

然後編輯Makefile,把CFLAG和CXXFLAG中的-g去掉,我們不用debug sqlite。

接下來就可以編譯和安裝sqlite了:

[plain]
view plain

make
make install

這一步就完成了sqlite的編譯和安裝了。

編譯python

先去http://www.python.org/download/下載最新版本的python源代碼,我這里下載的是:

[plain]
view plain

http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2

先把python解壓縮:

[plain]
view plain

tar jxf Python-2.5.1.tar.bz2
cd Python-2.5.1

編譯pc版本的語法解析器

由於在編譯python的時候,需要先編譯一個叫pgen的程序出來,用於生成語法解析器,所以我們要先生成一個pc版本的pgen:

[plain]
view plain

mkdir build.pc
cd build.pc
../configure
make Parser/pgen

然後ls Parser一下,應該就能看到有pgen了。

修改configure

configure在檢測編譯器的printf是否支持%zd的時候,如果發現是在cross compile,就直接不幹活了。這還了得?

把這一部分的檢測代碼去掉。這段代碼起始於

[plain]
view plain

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

結束於

[plain]
view plain

cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把這兩段以及中間的內容都刪除掉就可以了。

編譯arm版本的python

有了語法解析器,就可以開始編譯arm版本的python了。

[plain]
view plain

mkdir ../build.arm
cd ../build.arm
../configure --prefix=/home/leojay/test/arm-system-working/rootfs --disable-ipv6 --host=arm-linux --enable-shared

先創建一個用於編譯的目錄build.arm,再對python做一些配置,如安裝目錄,不要ipv6,使用arm-linux的編譯器,生成動態鏈接庫。

修改Makefile

之後就要對Makefile做一些修改,把

[plain]
view plain

OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我們不要debug python,-O3改為-O2,空間緊張O2就可以了。



[plain]
view plain

PGEN= Parser/pgen$(EXE)

一行的下面加上

[plain]
view plain

PGEN_HOST= ../build.pc/Parser/pgen$(EXE)

表明我們在HOST上運行的pgen

在要使用PGEN的地方改為PGEN_HOST:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改為:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

修改所有使用新生成的python的地方。

所有如 ./$(BUILDPYTHON) 的地方,都改為python

如:

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改為

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

這種地方比較多,大家小心修改。

修改setup.py

setup.py負責編譯python的各個擴展模塊。但是,由於python完全沒有考慮cross compile,所以要做一些修改。

PyBuildExt類:

函數的前兩行是把/usr/local加到搜索目錄中,我們的cross compiler一般不會直接安裝在 /usr/local裡面的,所以這兩行去掉:

[plain]
view plain

lib_dirs, inc_dirs的設定中,把中括弧里的那些都去掉。 以下所有模塊都不要:
這個函數在編譯了所有的extension後,會去load這些剛編譯好的extension, 但我們在i686的電腦上顯然不能load,所以要跳過這些操作。 在 build_ext.build_extension(self, ext)後面直接寫一個return,不做load。
for d in ['/usr/local/arm/3.3.2/include']
for d in inc_dirs + sqlite_inc_paths:
ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
build_extension函數:
detect_moles函數:
cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,

[plain]
view plain

由於python本身的問題,現在ctypes還不能在除i386以外的機器上運行,所以ctypes也去掉 編譯sqlite的地方:

[plain]
view plain

改為:

[plain]
view plain

因為我的sqlite3安裝在這里,如果這里不改的話,setup.py會在我的電腦上找sqlite

main函數:
setup函數調用的時候,把要安裝的scripts那一部分去掉

之後就可以make && make install了。

附上我修改後的 Makefile 和 setup.py 供大家參考

裁減python

python完全安裝後,實在是很大,所以,要把一些肯定用不上的庫去掉。 所以,再附上我的裁減腳本 cleanpy.sh

注意,由於我的python程序都運行在python -OO的參數下,所有的.py和.pyc都不需要, 只要有.pyo就可以了。所以,這個腳本會把所有的.py和.pyc都刪除掉。

大家可以根據自己的需要做調整。

❷ 如何在arm伺服器構建docker鏡像

在這個M伺服器上裝一個這個模擬器,還有這個編譯器,然後來再這個就可以搭建起來。

❸ 如何使用Docker構建運行時間較長的腳本

問題
讓我們從這個我試圖解決的問題開始。我開發了一個會運行很長時間的構建腳本,這個腳本中包含了很多的步驟。
這個腳本會運行1-2個小時。
它會從網路下載比較大的文件(超過300M)。
後面的構建步驟依賴前期構建的庫。
但最最煩人的是,運行這個腳本真的需要花很長的時間。
文件系統是固有狀態
我們一般是通過一種有狀態的方式與文件系統進行交互的。我們可以添加、刪除或移動文件。我們可以修改文件的 許可權或者它的訪問時間。大部分獨立的操作都可以撤銷,例如將文件移動到其它地方後,你可以將文件恢復到原來的位置。但我們不會通過快照的方式來將它恢復到 原始狀態。這篇文章我將會介紹如何在耗時較長的腳本中充分利用快照這一特性。
使用聯合文件系統的快照
Docker使用的是聯合文件系統叫做AUFS(譯者註:簡單來說就是支持將不同目錄掛載到同一個虛擬文件系統下的文件系統)。聯合文件系統實現了Union mount。顧名思義,也就是說不同的文件系統的文件和目錄可以分層疊加在單個連貫文件系統之上。這是通過分層的方式完成的。如果一個文件出現在兩個文件系統,那最高層級的文件才會顯示(該文件其它版本也是存在於層級中的,不會改變,只是看不到的)。
在Docker中,每一個在Union mount轉哦給你的文件系統都被稱為layers(層)。使用這種技術可以輕松實現快照,每個快照都是所有層的一個Union mount。
生成腳本的快照
使用快照可以幫助構建一個長時運行的腳本。總的想法是,將一個大的腳本分解為許多小的腳本(我喜歡稱之為 scriptlets),並單獨運行這些小的腳本,腳本運行後為其文件系統打一個快照 (Docker會自動執行此操作)。如果你發現一個scriptlet運行失敗,你可以快速回退到上次的快照,然後再試一次。一旦你完成腳本的構建,並且 可以保證腳本能正常工作,那你就可以將它分配給其它主機。
回過頭來再對比下,如果你沒有使用快照功能了?當你辛辛苦苦等待了一個半小時後,腳本卻構建失敗了,我想除了少部分有耐心的人外,很多人是不想再來一次了,當然,你也會盡最大努力把系統恢復到失敗前的狀態,比如可以刪除一個目錄或運行make clean。
但是,我們可能沒有真正地理解我們正在構建的組件。它可能有復雜的Makefile,它會把把文件放到文件系統中我們不知道的地方,唯一真正確定的途徑是恢復到快照。
使用快照構建腳本的Docker
在本節中,我將介紹我是如何使用Docker實現GHC7.8.3 ARM交叉編譯器的構建腳本。Docker非常適合做這件事,但並非完美。我做了很多看起來沒用的或者不雅的事情,但都是必要的,這都是為了保證將開發腳本的總時間降到最低限度。構建腳本可以在這里找到。
用Dockerfile構建
Docker通過讀取Dockerfile來構建鏡像。Dockerfile會通過一些命令來具體指定應該執行哪些動作。具體使用說明可以參考這篇文章。在我的腳本中主要用到WORKDIR、ADD和RUN。ADD命令非常有用因為它可以讓你在運行之前將外部文件添加到當前Docker鏡像中然後轉換成鏡像的文件系統。你可以在這里看到很多scriptlets構成的構建腳本。
設計
1. 在RUN之前ADD scriptlets
如果你很早就將所有的scriptletsADD在Dockerfile,您可能會遇到以下問題:如果你的腳本構建失敗,你回去修改scriptlet並再次運行docker build。但是你發現,Docker開始在首次加入scriptlets的地方構建!這樣做會浪費了大量的時間並且違背了使用快照的目的。
出現這種情況的原因是由於Docker處理它的中間鏡像(快照)的方式。當Docker通過Dockerfile構建鏡像時,它會與中間鏡像比較當前命令是否一致。然而,在ADD命令的情況下被裝進鏡像的文件里的內容也會被檢查。如果相對於現有的中間鏡像,文件已經改變,那麼Docker也別無選擇,只能從這點開始建立一個新的鏡像。因為Docker不知道這些變化會不會影響到構建。
此外,使用RUN命令要注意,每次運行時它都會導致文件系統有不同的更改。在這種情況下,Docker會發現中間鏡像並使用它,但是這將是錯誤的。RUN命令每次運行時會造成文件系統相同的改變。舉個例子,我確保在我的scriptlets我總是下載了一個已知版本的文件與一個特定MD5校驗。
對Docker 構建緩存更詳細的解釋可以在這里找到。
2.不要使用ENV命令來設置環境變數,請使用scriptlet。
它似乎看起來很有誘惑力:使用ENV命令來設置所有構建腳本需要的環境變數。但是,它不支持變數替換的方式,例如 ENV BASE=$HOME/base 將設置BASE的值為$HOME/base著很可能不是你想要的。
相反,我用ADD命令添加一個名為set-env.sh文件。此文件會包含在後續的scriptlet中:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env-1.sh
如果你沒有在第一時間獲取set-env.sh會怎麼樣呢?它很早就被加入Dockerfile並不意味著修改它將會使隨後的快照無效?
是的,這會有問題。在開發腳本時,我發現,我已經錯過了在set-env.sh添加一個有用的環境變數。解決方案是創建一個新的文件set-env-1.sh包含:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env.sh
if ! [ -e "$CONFIG_SUB_SRC/config.sub" ] ; then
CONFIG_SUB_SRC=${CONFIG_SUB_SRC:-$NCURSES_SRC}
fi
然後,在所有後續的scriptlets文件中包含了此文件。現在,我已經完成了構建腳本,我可以回去解決這個問題了,但是,在某種意義上,它會破壞最初的目標。我將不得不從頭開始運行構建腳本看看這種變化是否能成功。
缺點
一個主要缺點是這種方法是,所構建的鏡像尺寸是大於它實際需求的尺寸。在我的情況下尤其如此,因為我在最後刪除了大量文件的。然而,這些文件都仍然存在於聯合掛載文件系統的底層文件系統內,所以整個鏡像是大於它實際需要的大小至少多餘的是刪除文件的大小。
然而,有一個變通。我沒有公布此鏡像到Docker Hub Registry。相反,我:
使用docker export導出內容為tar文件。
創建一個新的Dockerfile簡單地添加了這個tar文件的內容。
產生尺寸盡可能小的鏡像。
結論
這種方法的優點是雙重的:
它使開發時間降至最低,不再做那些已經構建成功的子組件。你可以專注於那些失敗的組件。
這非常便於維護構建腳本。構建可能會失敗,但只要你搞定Dockerfiel,至少你不必再從頭開始。
此外,正如我前面提到的Docker不僅使寫這些構建腳本更加容易,有了合適的工具同樣可以在任何提供快照的文件系統實現。

❹ 如何編譯arm linux的go

Golang也就是Go語言,現在已經發行到1.4.1版本了,語言特性優越性和背後Google強大靠山什麼的就不多說了。Golang的官方提供了多個平台上的二進制安裝包,遺憾的是並非沒有發布ARM平台的二進制安裝包。ARM平台沒辦法直接從官網下載二進制安裝包來安裝,好在Golang是支持多平台並且開源的語言,因此可以通過直接在ARM平台上編譯源代碼來安裝。整個過程主要包括編譯工具配置、獲取Golang源代碼、設置Golang編譯環境變數、編譯、配置Golang行環境變數等步驟。
註:本文選用樹莓派做測試,因為樹莓派是基於ARM平台的。

1、編譯工具配置
據說下個版本的golang編譯工具要使用golang自己來寫,但目前還是使用C編譯工具的。因此,首先要配置好C編譯工具:
1.1 在Ubuntu或Debian平台上可以使用sudo apt-get install gcc libc6-dev命令安裝,樹莓派的RaspBian系統是基於Debian修改的,所以可以使用這種方法安裝。
1.2 在RedHat或CentOS 6平台上可以使用sudo yum install gcc libc-devel命令安裝。
安裝完成後可以輸入 gcc --version命令驗證是否成功安裝。

2、獲取golang源代碼
2.1 直接從官網下載源代碼壓縮包。
golang官網提供golang的源代碼壓縮包,可以直接下載,最新的1.4.1版本源代碼鏈接:https://storage.googleapis.com/golang/go1.4.1.src.tar.gz
2.2 使用git工具獲取。
golang使用git版本管理工具,也可以使用git獲取golang源代碼。推薦使用這個方法,因為以後可以隨時獲取最新的golang源代碼。
2.2.1 首先確認ARM平台上已經安裝了git工具,可以使用git --version命令確認。一般linux平台都安裝了git,沒有的話可以自行安裝,不同平台的安裝方法可以參考:http://git-scm.com/download/linux
2.2.2 克隆遠程golang的git倉庫到本地
在終端cd到你想要安裝golang的目錄,確保該目錄下沒有名為go的目錄。然後以下命令獲取代碼倉庫:
git clone https://go.googlesource.com/go
大陸地區可能會獲取失敗,在不翻牆的情況下我試了幾次都沒成功,原因大家都懂的。好在google已經將golang也託管到github上面,所以也可以通過下面命令獲取:
git clone https://github.com/golang/go.git
視網路情況,下載可能需要不少時間。我2M的帶寬花了將近兩個小時才下載完,雖然整個項目不過幾十兆= =
下載完成後,可以看到目錄下多了一個go目錄,裡面即為golang的源代碼,在終端上執行cd go命令進入該目錄。
執行下面命令檢出go1.4.1版本的源代碼,因為現在已經有新的代碼提交上去了,最新的代碼可能不是最穩定的:
git checkout go1.4.1
至此,最新1.4.1發行版的源代碼獲取完畢

3、設置golang的編譯環境變數
主要有GOROOT、GOOS、GOARCH、GOARM四個環境變數需要設置,先解釋四個環境變數的意義。
3.1 GOROOT
主要代表golang樹結構目錄的路徑,也就是上面git檢出的go目錄。一般可以不用設置這個環境變數,因為編譯的時候默認會以go目錄下src子目錄中的all.bash腳本運行時的父目錄作為GOROOT的值。為了保險起見,可以直接設置為go目錄的路徑。
3.2 GOOS和GOARCH
分別代表編譯的目標系統和平台,可選值如下:

GOOS GOARCH
darwin 386
darwin amd64
dragonfly 386
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
linux 386
linux amd64
linux arm
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
plan9 386
plan9 amd64
solaris amd64
windows 386
windows amd64
需要注意的是這兩個值代表的是目標系統和平台,而不是編譯源代碼的系統和平台。樹莓派的RaspBian是linux系統,所以這些GOOS設置為linux,GOARCH設置為arm。
3.3 GOARM
表示使用的浮點運算協處理器版本號,只對arm平台有用,可選值有5,6,7。如果是在目標平台上編譯源代碼,這個值可以不設置,它會自動判斷需要使用哪一個版本。
總結下來,在樹莓派上設置golang的編譯環境變數,可編輯$HOME/.bashrc文件,在末尾添加下面內容:
export GOROOT=你的go目錄路徑
export GOOS=linux
export GOARCH=arm
編輯完後保存,執行source ~/.bashrc命令讓修改生效。

4、編譯源代碼
環境變數配置完成自後就可以開始編譯源代碼。在go目錄下的src子目錄中,主要有all.bash和make.bash兩個腳本(另外還有兩個all.bat和make.bat腳本適用於window平台)。編譯實際上就是執行其中一個腳本,兩者的區別在於all.bash在編譯完成後還會執行一些測試套件。如果希望只編譯不測試,可以運行make.bash腳本。使用cd命令進入go下src目錄,執行./all.bash或者./make.bash命令即可開始編譯。由於硬體情況不同,編譯耗費的時間不同。在我的B型樹莓派編譯過程花費了將近半個小時,編譯完成後執行的測試套件又花費了差不多一個小時,總共花費了一個半小時左右。

5、配置golang運行環境變數
編譯完成後,go目錄下會生成bin目錄,裡面就是go的運行腳本。為了以後使用方法,可以將這個bin路徑添加到PATH環境變數中。同樣編輯~/.bashrc文件,因為前面設置過GOROOT環境變數指向go目錄了,所以只需要在末尾加上
export PATH=$PATH:$GOROOT/bin
保存後同樣執行source ~/.bashrc命令讓環境變數生效。

至此,golang源代碼編譯安裝成功。執行go version應該就能看到當前golang的版本信息,表示編譯安裝成功。

❺ arm下ubuntu怎麼安裝docker

ubuntu下安裝Docker

Docker 是 dotCloud 最近幾個月剛宣布的開源引擎,旨在提供一種應用程序的自動化部署解決方案,簡單的說就是,在 Linux 系統上迅速創建一個容器(類似虛擬機)並在容器上部署和運行應用程序,並通過配置文件可以輕松實現應用程序的自動化安裝、部署和升級,非常方便。因為使用了容器,所以可以很方便的把生產環境和開發環境分開,互不影響,這是 docker 最普遍的一個玩法。更多的玩法還有大規模 web 應用、資料庫部署、持續部署、集群、測試環境、面向服務的雲計算、虛擬桌面 VDI 等等。

注意:由於Docker需要在Linux Kernel 3.8及以上才可以很好的工作【本人在ubuntu12.04 lts 內核3.2也正常安裝】,官方更是推薦Ubuntu系統,這里有兩種選擇:Ubuntu 12.04 LTS或最新的Ubuntu 13.10 而本文比較喜歡傾向LTS,幸好有辦法解決Kernel版本問題。

1、更新Ubuntu內核
使用如下命令行更新內核至3.8.0-25
sudo apt-get install linux-image-3.8.0-25-generic
sudo apt-get install linux-headers-3.8.0-25-generic
完成後重啟電腦,通過命令 「uname -r」 來查看內核是否成功更新。

2、安裝lxc-docker
root@ubuntu: sudo apt-get install software-properties-common #增加 add-apt-repository 命令
root@ubuntu: sudo apt-get install python-software-properties
root@ubuntu: sudo add-apt-repository ppa:dotcloud/lxc-docker #增加一個ppa源,如:ppa:user/ppa-name
root@ubuntu: sudo apt-get update #更新系統
root@ubuntu: sudo apt-get install lxc-docker

3、測試doctor是否安裝成功

root@ubuntu:~# docker #出現如下信息表示docker安裝成功
Usage: docker [OPTIONS] COMMAND [arg...]
-H=[tcp://127.0.0.1:4243]: tcp://host:port to bind/connect to or unix://path/to/socket touse

A self-sufficient runtime for linux containers.
...
4、Hello World
4.1、下載官方ubuntu image
linjiqin@ubuntu:~$ sudo docker pull ubuntu #pull命令需要到國外的鏡像倉庫,拉取鏡像,因為GFW的關系,拉取失敗的可能性很大

4.2、運行hello world
linjiqin@ubuntu:~$ sudo docker run ubuntu /bin/echo hello world

5、docker常用命令
5.1、docker三種命令運行模式
docker有三種命令運行的方式:短暫方式、交互方式、daemon方式。
a、短暫方式:就是剛剛的那個」hello world」,命令執行完後,container就終止了,不過並沒有消失,可以用 sudo docker ps -a 看一下所有的container,第一個就是剛剛執行過的container,可以再次執行一遍:
linjiqin@ubuntu:~$ sudo docker start container_id

不過這次看不到」hello world」了,只能看到ID,用logs命令才能看得到:
linjiqin@ubuntu:~$ sudo docker logs container_id
可以看到兩個」hello world」,因為這個container運行了兩次。

b、交互方式
linjiqin@ubuntu:~$ sudo docker run -i -t image_name /bin/bash #image_name為docker鏡像名稱

c、daemon方式
即讓軟體作為長時間服務運行,這就是SAAS啊!
例如,一個無限循環列印的腳本(替換為memcached、apache等,操作方法仍然不變!):
linjiqin@ubuntu:~$ CONTAINER_ID=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done")

在container外面查看它的輸出
linjiqin@ubuntu:~$ sudo docker logs $CONTAINER_ID
或者連接上容器實時查看
linjiqin@ubuntu:~$ sudo docker attach $CONTAINER_ID

終止容器
linjiqin@ubuntu:~$ sudo docker stop $CONTAINER_ID
linjiqin@ubuntu:~$ sudo docker ps #看一下,已經沒了

5.2、docker ps命令
linjiqin@ubuntu:~$ sudo docker ps #列出當前所有正在運行的container
linjiqin@ubuntu:~$ sudo docker ps -l #列出最近一次啟動的,且正在運行的container
linjiqin@ubuntu:~$ sudo docker ps -a #列出所有的container
注意:
a、其他用法請參考 sudo docker ps -h
b、還有一種方式可以讓程序在daemon模式下運行,就是在Dockerfile里設置USER為daemon

5.3、docker export命令
linjiqin@ubuntu:~$ container_id=`docker run -d <image_name> ls`
linjiqin@ubuntu:~$ docker export $container_id > image.tgz

5.4、docker import命令
linjiqin@ubuntu:~$ cat image.tgz | sudo docker import - simple_dev #simple_dev為自定義的鏡像名稱

5.5、docker port命令
linjiqin@ubuntu:~$ docker run -p 80:8080 <image> <cmd> #映射容器的8080埠到宿主機的80埠

5.6、刪除容器
5.6.1、刪除所有容器
linjiqin@ubuntu:~$ sudo docker rm `sudo docker ps -a -q`

5.6.1、刪除具體某個容器
linjiqin@ubuntu:~$ sudo docker rm $CONTAINER_ID

5.7、docker命令快速參考
linjiqin@ubuntu:~$ sudo docker images #查看本地鏡像
linjiqin@ubuntu:~$ sudo docker attach $CONTAINER_ID #啟動一個已存在的docker實例
linjiqin@ubuntu:~$ sudo docker stop $CONTAINER_ID #停止docker實例
linjiqin@ubuntu:~$ sudo docker logs $CONTAINER_ID #查看docker實例運行日誌,確保正常運行

linjiqin@ubuntu:~$ sudo docker inspect $CONTAINER_ID #查看container的實例屬性,比如ip等等

sudo docker run -t -i -v /home/linjiqin/dev/docker:/home/mycontainer:rw -p 8000:8000 mydocker /bin/bash

寫在前面,運行我們的鏡像的命令使用上面的為參考,這樣會掛載本地文件夾,並且會映射container的8000埠到宿主機的8000埠
/home/linjiqin/dev/docker為要掛載的本地文件夾,需提前創建
/home/mycontainer為docker映射路徑,執行上面命令會幫我們創建

❻ GCC能否運行於ARM-Linux環境下即GCC能否在ARM平台上運行

簡答:

gcc可以運行在arm-linux下。

gcc,可以在arm平台上運行。


詳解:

gcc,一般指的是,pc版,x86的平台,

用於嵌入式系統,比如arm的cpu,linux的系統下,是:

本來,一直就可以的,

而且有專門的屬於:

交叉編譯

簡答說就是:

在你的pc端,x86的cpu上,製作出一個交叉編譯器

一般叫做arm-linux-gcc

用此arm-linux-gcc去編譯你的程序

編譯出來的程序,可以運行在嵌入式開發板,比如arm的linux下


極其詳盡的解釋:

我剛寫個教程,你去看就知道了:

交叉編譯詳解

交叉編譯詳解
http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html

此教程的主要內容包括:


等你看完了後,建議用crosstool-ng,或者是buildroot去自己編譯一個arm-linux的gcc。

❼ 如何在"特殊"的網路環境下編譯 Docker

由於 Docker 編譯需要依賴於 Docker Daemon ,所以只能在 64 位的 Linux 環境下先安裝 Docker 程序,再從 Github 上克隆 Docker 的代碼進行編譯。
在 Docker 的目錄下執行 make 命令將默認執行 Makefile 中 make binary 指令進行編譯。
?

default: binary

all: build
$(DOCKER_RUN_DOCKER) hack/make.sh

binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary

cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross

從以上的 Makefile 可以看出,執行 make、make binary、make all 或 make cross 都可以得到可運行的 Docker 程序。
在 Mac OS 環境下使用 brew 的命令安裝 Docker ,只能得到一個 docker client 的二進製程序,如果以 daemon 的方式運行,會得到 『This is a client-only binary - running the Docker daemon is not supported.』 的錯誤提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
?

FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker

Dockerfile 中只保留必要的步驟就可以實現編譯了。
方法 3.
對 Docker 代碼中的 Docker 進行徹底的改造,用國內的各種鏡像替換其中不能在「正常」網路條件下訪問的鏡像,使得代碼能夠快速編譯通過。
?

FROM docker.cn/docker/ubuntu:14.04.1
MAINTAINER Meaglith Ma <[email protected]> (@genedna)

RUN echo "deb http://mirrors.aliyun.com/ubuntu trusty main universe" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0* \
unzip \
--no-install-recommends

RUN git clone --no-checkout https://coding.net/genedna/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103

RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper

RUN curl -sSL http://docker-cn.qiniudn.com/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
ENV PATH /go/bin:$PATH
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1

ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm
ENV GOARM 5
RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'

RUN mkdir -p /go/src/github.com/gpmgo \
&& cd /go/src/github.com/gpmgo \
&& curl -o gopm.zip http://gopm.io/api/v1/download?pkgname=github.com/gpmgo/gopm\&revision=dev --location \
&& unzip gopm.zip \
&& mv $(ls | grep "gopm-") gopm \
&& rm gopm.zip \
&& cd gopm \
&& go install

RUN gopm bin -v code.google.com/p/go.tools/cmd/cover

RUN gem sources --remove https://rubygems.org/ \
&& gem sources -a https://ruby.taobao.org/ \
&& gem install --no-rdoc --no-ri fpm --version 1.0.2

RUN gopm bin -v -d /go/bin github.com/cpuguy83/go-md2man@tag:v1

RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox

RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg

RUN git config --global user.email '[email protected]'

RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeser

VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux

ENTRYPOINT ["hack/dind"]

COPY . /go/src/github.com/docker/docker

以上的命令把 Ubuntu 鏡像中的源替換為國內速度較快的阿里源;把 lvm2 鏡像到國內的 Git 託管服務 coding.net;從 七牛雲存儲 保存的 Golang 源碼進行獲取和編譯;使用 gopm 下載編譯所需要的 Library ;最後把其中 gem 源切換到淘寶。至此,可以在「特殊」的網路條件下快速編譯 Docker 。

❽ 為毛這么多軟體不能用arm編譯器怎麼裝

一般安裝了一個軟體,會包括編譯環境,編碼器,優化器等,現在都集成了很多,ARM支持C,匯編,高級的還有vc++ 比如我用的ads1.20 就有那麼多。
至於下程序到arm上,需要安裝一個軟體,我用的是HJTAG,因為我用JTAG模擬,所以我一共安裝了2個軟體。
但如果跑系統,你還得有頭文件,這個與你arm 用的操作系統有關,是代碼。
步驟肯定會有,1是你不會機器碼,在arm上就是機器碼,所以一定會有編譯器,但這些是集成的,下載軟體是燒程序的,這個和下載器配套。其他的是編寫程序相關的,初學者可以不跑系統,直接當單片機用,我至今只玩過ucos ,沒玩linux

❾ 如何建立Linux下的ARM交叉編譯環境

這個過程如下
1. 下載源文件、補丁和建立編譯的目錄
2. 建立內核頭文件
3. 建立二進制工具(binutils)
4. 建立初始編譯器(bootstrap gcc)
5. 建立c庫(glibc)
6. 建立全套編譯器(full gcc)
下載源文件、補丁和建立編譯的目錄
1. 選定軟體版本號
選擇軟體版本號時,先看看glibc源代碼中的INSTALL文件。那裡列舉了該版本的glibc編譯時所需的binutils 和gcc的版本號。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。
我選的各個軟體的版本是:
linux-2.4.21+rmk2
binutils-2.10.1
gcc-2.95.3
glibc-2.2.3
glibc-linuxthreads-2.2.3
如果你選的glibc的版本號低於2.2,你還要下載一個叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內核你可以從www.kernel.org 或它的鏡像下載。
Binutils、gcc和glibc你可以從FSF的FTP站點ftp://ftp.gun.org/gnu/ 或它的鏡像去下載。在編譯glibc時,要用到 Linux 內核中的 include 目錄的內核頭文件。如果你發現有變數沒有定義而導致編譯失敗,你就改變你的內核版本號。例如我開始用linux-2.4.25+vrs2,編譯glibc-2.2.3 時報 BUS_ISA 沒定義,後來發現在 2.4.23 開始它的名字被改為 CTL_BUS_ISA。如果你沒有完全的把握保證你改的內核改完全了,就不要動內核,而是把你的 Linux 內核的版本號降低或升高,來適應 glibc。
Gcc 的版本號,推薦用 gcc-2.95 以上的。太老的版本編譯可能會出問題。Gcc-2.95.3 是一個比較穩定的版本,也是內核開發人員推薦用的一個 gcc 版本。
如果你發現無法編譯過去,有可能是你選用的軟體中有的加入了一些新的特性而其他所選軟體不支持的原因,就相應降低該軟體的版本號。例如我開始用 gcc-3.3.2,發現編譯不過,報 as、ld 等版本太老,我就把 gcc 降為 2.95.3。太新的版本大多沒經過大量的測試,建議不要選用。

2. 建立工作目錄
首先,我們建立幾個用來工作的目錄:
在你的用戶目錄,我用的是用戶liang,因此用戶目錄為 /home/liang,先建立一個項目目錄embedded。
$pwd
/home/liang
$mkdir embedded

再在這個項目目錄 embedded 下建立三個目錄 build-tools、kernel 和 tools。
build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。
kernel-用來存放你的內核源代碼和內核補丁。
tools-用來存放編譯好的交叉編譯工具和庫文件。
$cd embedded
$mkdir build-tools kernel tools

執行完後目錄結構如下:
$ls embedded
build-tools kernel tools

3. 輸出和環境變數
我們輸出如下的環境變數方便我們編譯。
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH

如果你不慣用環境變數的,你可以直接用絕對或相對路徑。我如果不用環境變數,一般都用絕對路徑,相對路徑有時會失敗。環境變數也可以定義在.bashrc文件中,這樣當你logout或換了控制台時,就不用老是export這些變數了。
體系結構和你的TAEGET變數的對應如下表

你可以在通過glibc下的config.sub腳本來知道,你的TARGET變數是否被支持,例如:
$./config.sub arm-linux
arm-unknown-linux-gnu

在我的環境中,config.sub 在 glibc-2.2.3/scripts 目錄下。
網上還有一些 HOWTO 可以參考,ARM 體系結構的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 體系結構的《Linux for PowerPC Embedded Systems HOWTO》等。對TARGET的選取可能有幫助。
4. 建立編譯目錄
為了把源碼和編譯時生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個目錄來專門用於編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。
$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch

build-binutils-編譯binutils的目錄
build-boot-gcc-編譯gcc 啟動部分的目錄
build-glibc-編譯glibc的目錄
build-gcc-編譯gcc 全部的目錄
gcc-patch-放gcc的補丁的目錄
gcc-2.95.3 的補丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 http://www.linuxfromscratch.org/ 下載到這些補丁。
再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代碼放入 build-tools 目錄中
看一下你的 build-tools 目錄,有以下內容:
$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz

建立內核頭文件
把你從 www.kernel.org 下載的內核源代碼放入 $PRJROOT /kernel 目錄
進入你的 kernel 目錄:
$cd $PRJROOT /kernel

解開內核源代碼
$tar -xzvf linux-2.4.21.tar.gz


$tar -xjvf linux-2.4.21.tar.bz2

小於 2.4.19 的內核版本解開會生成一個 linux 目錄,沒帶版本號,就將其改名。
$mv linux linux-2.4.x

給 Linux 內核打上你的補丁
$cd linux-2.4.21
$patch -p1 < ../patch-2.4.21-rmk2

編譯內核生成頭文件
$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
你也可以用 config 和 xconfig 來代替 menuconfig,但這樣用可能會沒有設置某些配置文件選項和沒有生成下面編譯所需的頭文件。推薦大家用 make menuconfig,這也是內核開發人員用的最多的配置方法。配置完退出並保存,檢查一下的內核目錄中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,這是編譯 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也說明了你生成了正確的頭文件。
還要建立幾個正確的鏈接
$cd include
$ln -s asm-arm asm
$cd asm
$ln -s arch-epxa arch
$ln -s proc-armv proc

接下來為你的交叉編譯環境建立你的內核頭文件的鏈接
$mkdir -p $TARGET_PREFIX/include
$ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
$in -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm

也可以把 Linux 內核頭文件拷貝過來用
$mkdir -p $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include

建立二進制工具(binutils)
binutils是一些二進制工具的集合,其中包含了我們常用到的as和ld。
首先,我們解壓我們下載的binutils源文件。
$cd $PRJROOT/build-tools
$tar -xvjf binutils-2.10.1.tar.bz2

然後進入build-binutils目錄配置和編譯binutils。
$cd build-binutils
$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX

--target 選項是指出我們生成的是 arm-linux 的工具,--prefix 是指出我們可執行文件安裝的位置。
會出現很多 check,最後產生 Makefile 文件。
有了 Makefile 後,我們來編譯並安裝 binutils,命令很簡單。
$make
$make install

看一下我們 $PREFIX/bin 下的生成的文件
$ls $PREFIX/bin
arm-linux-addr2line arm-linux-gasp arm-linux-objmp arm-linux-strings
arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-as arm-linux-nm arm-linux-readelf
arm-linux-c++filt arm-linux-obj arm-linux-size

我們來解釋一下上面生成的可執行文件都是用來干什麼的
add2line - 將你要找的地址轉成文件和行號,它要使用 debug 信息。
Ar-產生、修改和解開一個存檔文件
As-gnu 的匯編器
C++filt-C++ 和 java 中有一種重載函數,所用的重載函數最後會被編譯轉化成匯編的標號,c++filt 就是實現這種反向的轉化,根據標號得到函數名。
Gasp-gnu 匯編器預編譯器。
Ld-gnu 的連接器
Nm-列出目標文件的符號和對應的地址
Obj-將某種格式的目標文件轉化成另外格式的目標文件
Objmp-顯示目標文件的信息
Ranlib-為一個存檔文件產生一個索引,並將這個索引存入存檔文件中
Readelf-顯示 elf 格式的目標文件的信息
Size-顯示目標文件各個節的大小和目標文件的大小
Strings-列印出目標文件中可以列印的字元串,有個默認的長度,為4
Strip-剝掉目標文件的所有的符號信息

建立初始編譯器(bootstrap gcc)
首先進入 build-tools 目錄,將下載 gcc 源代碼解壓
$cd $PRJROOT/build-tools
$tar -xvzf gcc-2.95.3.tar.gz

然後進入 gcc-2.95.3 目錄給 gcc 打上補丁
$cd gcc-2.95.3
$patch -p1< ../gcc-patch/gcc-2.95.3.-2.patch
$patch -p1< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch
$patch -p1< ../gcc-patch/gcc-2.95.3-returntype-fix.patch
echo timestamp > gcc/cstamp-h.in

在我們編譯並安裝 gcc 前,我們先要改一個文件 $PRJROOT/gcc/config/arm/t-linux,把
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
這一行改為
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h
你如果沒定義 -Dinhibit,編譯時將會報如下的錯誤
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
make[2]: *** [stmp-multilib-sub] Error 2
make[1]: *** [stmp-multilib] Error 1
make: *** [all-gcc] Error 2

❿ 如何建立Linux下的ARM交叉編譯環境

首先安裝交叉編譯器,網路「arm-linux-gcc」就可以一個編譯器壓縮包。
把壓縮包放到linux系統中,解壓,這樣就算安裝好了交叉編譯器。
設置編譯器環境變數,具體方式網路。如打開 /etc/bash.bashrc,添加剛才安裝的編譯器路徑 export PATH=/home/。。。/4.4.3/bin:$PATH。這樣是為了方便使用,用arm-linux-gcc即可,不然既要帶全路徑/home//bin/arm-linux-gcc,這樣不方便使用。
編譯c文件。和gcc編譯相似,把gcc用arm-linu-gcc代替就是了。編譯出來的就可以放到arm上運行了。</ol>

閱讀全文

與docker下能編譯arm嗎相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:764
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:841
安卓怎麼下載60秒生存 瀏覽:800
外向式文件夾 瀏覽:233
dospdf 瀏覽:428
怎麼修改騰訊雲伺服器ip 瀏覽:385
pdftoeps 瀏覽:490
為什麼鴻蒙那麼像安卓 瀏覽:733
安卓手機怎麼拍自媒體視頻 瀏覽:183
單片機各個中斷的初始化 瀏覽:721
python怎麼集合元素 瀏覽:477
python逐條解讀 瀏覽:829
基於單片機的濕度控制 瀏覽:496
ios如何使用安卓的帳號 瀏覽:880
程序員公園采訪 瀏覽:809
程序員實戰教程要多長時間 瀏覽:972
企業數據加密技巧 瀏覽:132
租雲伺服器開發 瀏覽:811
程序員告白媽媽不同意 瀏覽:333
攻城掠地怎麼查看伺服器 瀏覽:600