[Docker] 用別人做好的 docker image 跑 moinmoin wiki

[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:

Screen Shot 2016-01-07 at 12.04.33 AM  

 

因為我是將整個 /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 的網頁,卻會發生錯誤:

Screen Shot 2016-01-07 at 10.55.00 PM     

 

嗯… 它說 /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 頁面出現了,資料也都可以看到囉~

Screen Shot 2016-01-07 at 11.18.36 PM  

 

(本頁面已被瀏覽過 298 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料