問題
我們在使用Alpine的時候很有可能會使用到以前在其他操作系統(tǒng)中編譯好的一些工具抖甘,比如日志切割工具cronolog,我們將它拷貝到Alpine鏡像容器中使用闷尿,但是問題來了塑径,使用的時候說該工具找不到 not found
演示
為了更好理解,從頭到尾演示一下此問題填具,在我的宿主機(jī)上有一個已經(jīng)編譯好的cronolog(日志切割工具的安裝不在本文講解统舀,本文以cronolog演示not found問題也是為了后面文章需要做準(zhǔn)備),拷貝到Alpine鏡像容器中劳景。
[root@node01 ~]# which cronolog
/usr/local/sbin/cronolog
# 拷貝到容器
[root@node01 ~]# docker cp /usr/local/sbin/cronolog alpine:/root
容器中查看,已經(jīng)有了此文件
~ # ls
cronolog tzdata
在容器中使用cronolog绑咱,下面一段shell語句意思是每隔一秒鐘打印一次test... 并且通過日志切割工具cronolog按小時保存在不同文件中。
while true; do echo 'test...';sleep 1;done|/root/cronolog /root/test-%m%d%H.log
# 報錯了
~ # while true; do echo 'test...';sleep 1;done | /root/cronolog /root/test-%m%d%H.log
/bin/sh: /root/cronolog: not found
很是奇怪枢泰,明明就在這個目錄,文件權(quán)限也是可執(zhí)行的铝噩。就是not found衡蚂。將cronolog移到path路徑下試試。
mv /root/cronolog /bin
## 查找一下骏庸,沒問題毛甲,已經(jīng)在PATH下
~ # which cronolog
/bin/cronolog
## 再次執(zhí)行 還是 not found
~ # while true; do echo 'test...';sleep 1;done | cronolog /root/test-%m%d%H.log
/bin/sh: cronolog: not found
原因
一般來說linux下編譯二進(jìn)制文件,所需要的動態(tài)鏈接庫是在/lib64目錄下具被,但是Alpine使用的是musl libc并不是標(biāo)準(zhǔn)的glibc玻募,所以動態(tài)鏈接庫的位置不一樣,在alpine中沒有l(wèi)ib64目錄一姿,動態(tài)鏈接庫在lib目錄下七咧。
在centos下使用ldd查看下cronolog依賴庫如下,依賴于/lib64/ld-linux-x86-64.so.2
[root@node01 cronolog]# ldd /usr/local/sbin/cronolog
linux-vdso.so.1 => (0x00007ffdceb9d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3908f6a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3909338000)
容器中執(zhí)行叮叹,明顯也是依賴于 /lib64/ld-linux-x86-64.so.2
~ # ldd /bin/cronolog
/lib64/ld-linux-x86-64.so.2 (0x7f5fac40f000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f5fac40f000)
解決辦法
在上一篇文章我有提到過
Alpine使用的c庫使用mini版的musl libc與其他Linux發(fā)行版使用的gnu libc不一樣艾栋。雖說號稱兼容,但也只是部分兼容了蛉顽,缺啥補(bǔ)啥就是蝗砾,通過一個軟鏈接來關(guān)聯(lián)。
## 創(chuàng)建一個軟連接
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
## 再次執(zhí)行
~ # while true; do echo 'test...';sleep 1;done| cronolog /root/test-%m%d%H.log
## 已經(jīng)生成日志文件
~ # ls
test-120617.log tzdata
~ # cat test-120617.log
test...
歡迎關(guān)注携冤,學(xué)習(xí)不迷路悼粮!