[Docker] 用別人做好的 docker image 跑 moinmoin wiki
之前曾經在 Ubuntu 12.04 VM 上安裝 MoinMoin wiki,
不過後來裝 Ubuntu 的 ESXi 掛掉,本來是把硬碟資料複製出來,
用 VMware Workstation Pro 跑那個 VM,
可是後來 Ubuntu 出了些問題,就重裝成 CentOS 7 了~
原本的 VM 太大,我就只備份了 /usr/local/share/moin 目錄,
想說用 docker 找一個別人作好的 moinmoin image 來跑,
以為是很簡單的事情,卻遇到了好幾個問題需要解決~~
1. 從 Docker Hub 上搜尋適合的 moinmoin image
到 Docker Hub 上搜尋 moin,可以看到好幾個 image,真是難以挑選…
用 Download 數排序之後,從最多人下載的開始看一下 Detail:
因為我是將整個 /usr/local/share/moin 的目錄備份下來,
因此會想要找可以將 moin 整個目錄掛載到 container 的 image~
而前面的幾個通常都是掛載 moin/data 那個子目錄而已,所以我不列入考慮~
(後來實驗了一下,只掛載 moin/data 目錄的話,
似乎沒辦法將現有的 wiki 頁面顯示出來,所以確實不符合我的需求)
至於怎麼知道 image 要掛載什麼目錄呢?
一個是看它的說明有沒有寫,不然就是看它的 Dockerfile 的 VOLUME 敘述,
像下面的就指明了它的 /usr/local/share/moin/data 是可以掛載的:
VOLUME /usr/local/share/moin/data
我最後找到的是 eternnoir/moinmoin 這個 image,
它的 Dockerfile 的 VOLUME 路徑就是整個 moin 目錄:
VOLUME /usr/local/share/moin
2. 執行 moinmoin container 並掛載本機上的 moin 目錄
照著 eternnoir/moinmoin 網頁上的說明,我執行了下面的 docker run 指令,
將 /moin 目錄掛載到 container 的 /usr/local/share/moin 目錄:
docker run --rm -it -p 80:80 -v /moin:/usr/local/share/moin --name=wiki eternnoir/moinmoin
但才一執行,container 就吐出了 Permission denied 的訊息,然後就結束了:
* Starting enhanced syslogd rsyslogd [ OK ] *** Starting uWSGI 1.9.17.1-debian (64bit) on [Wed Jan 6 16:16:20 2016] *** compiled with version: 4.8.2 on 23 March 2014 17:15:32 os: Linux-3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 nodename: c3073f1d02fd machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 8 current working directory: / writing pidfile to /var/run/uwsgi-moinmoin.pid detected binary path: /usr/bin/uwsgi-core setuid() to 33 chdir(): Permission denied [core/uwsgi.c line 2468]
原來是因為我跑 docker 的這台主機是 CentOS 7,SELinux 有開,
因此要讓 container 裡面可以存取外部主機上的目錄時,-v 要加上 :z 或是 :Z 才行~
改用下面的方式來跑就行了:
docker run --rm -it -p 80:80 -v /moin:/usr/local/share/moin:Z --name=wiki eternnoir/moinmoin
執行結果如下,看起來似乎跑起來了:
* Starting enhanced syslogd rsyslogd [ OK ] *** Starting uWSGI 1.9.17.1-debian (64bit) on [Thu Jan 7 14:45:44 2016] *** compiled with version: 4.8.2 on 23 March 2014 17:15:32 os: Linux-3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 nodename: 203acb3e188a machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 8 current working directory: / writing pidfile to /var/run/uwsgi-moinmoin.pid detected binary path: /usr/bin/uwsgi-core setuid() to 33 ............ ............ *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 50) spawned uWSGI worker 1 (pid: 51, cores: 1) spawned uWSGI worker 2 (pid: 52, cores: 1) spawned uWSGI worker 3 (pid: 53, cores: 1) spawned uWSGI worker 4 (pid: 54, cores: 1)
3. 解決 moin 目錄 ownership 的問題
雖然 container 成功跑起來了,但如果去瀏覽 moinmoin 的網頁,卻會發生錯誤:
嗯… 它說 /usr/local/share/moin/config/data 目錄不存在,或者是 ownership/permission 有問題,
這時可以用 docker exec 在執行中的 container 裡叫出 shell 這個方法,
進到執行中的 container 裡面觀察狀況:
testuser@localhost ~ $ docker exec -it wiki /bin/bash root@203acb3e188a:/# ll /usr/local/share/moin/config/ total 20 drwxr-xr-x. 7 1000 1000 4096 Dec 14 02:37 data drwxr-xr-x. 2 1000 1000 71 Dec 14 02:37 logging drwxr-xr-x. 2 1000 1000 4096 Dec 14 02:37 more_samples drwxr-xr-x. 3 1000 1000 18 Dec 14 02:37 underlay -rw-r--r--. 1 1000 1000 7590 Dec 14 02:37 wikiconfig.py -rw-r-----. 1 1000 1000 2868 Jan 5 16:50 wikiconfig.pyc drwxr-xr-x. 2 1000 1000 42 Dec 14 02:37 wikifarm
可以看到 /usr/local/share/moin/config 這個目錄是存在的,
但是 owner 和 group 都變成了 1000…
這個 1000 事實上是 CentOS 上我用來執行 docker 的 testuser 帳號:
testuser@localhost ~ $ egrep 1000 /etc/passwd
testuser:x:1000:1000:testuser:/home/testuser:/bin/bash
如果有裝過 moinmoin 的話,應該會知道它的 user 通常是 www-data,
而在 container 跑起來的訊息裡面也有 setuid() to 33 這一行,
33 在 container 裡面代表的就是 www-data 這個使用者:
root@203acb3e188a:/# egrep 33 /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
看來要解決這個問題,就得將 moin 的目錄的擁有者 (owner) 設定成 www-data 才行…
查了一下,有些人是建議要用 data container 的方式來解決這類問題,
不過我還不會用 data container,所以想了個笨方法,
那就是將本機 CentOS 上的 moin 目錄擁有者直接改成 www-data~
當然我的本機 CentOS 上並沒有 www-data 這個使用者,
而正好也沒有用到 33 這個 uid,所以可以建一個 www-data 的 user/group,
然後將 uid/gid 都設成 33,這樣 container 掛載目錄時就 OK 了~
執行下面的三個指令,首先建立 www-data 這個群組 (gid=33),
再建立 www-data 這個使用者 (uid=33),讓它屬於 www-data 群組,
最後將本機上的 moin 目錄的擁有者改成 www-data:
sudo groupadd -g 33 www-data sudo useradd -u 33 -g www-data www-data sudo chown -R www-data: /moin
改好之後,再去瀏覽 moinmoin 網頁,
Yes! 之前的 wiki 頁面出現了,資料也都可以看到囉~