2017-11-07

openSUSE docker image for Tcl

openSUSE 有內建 docker,如果要安裝:
sudo zypper install docker

安裝以後,首先是先確定 Docker server 有在執行:
sudo systemctl status docker

如果沒有,需要啟動 Docker server:
sudo systemctl start docker

再來是下載 openSUSE LEAP 42.3 影像檔,
sudo docker pull opensuse:42.3

再來列出目前的影像檔,確定我們有下載成功:
sudo docker images

如果要執行 openSUSE LEAP 42.3 image,
sudo docker run -t -i opensuse:42.3 /bin/bash

接下來加入東西,建立自己的影像檔。首先是先建立一個工作目錄,然後
touch Dockerfile

接下來加入我們 Dockerfile 的內容:
FROM opensuse:42.3
MAINTAINER Danilo Chang 
RUN zypper addrepo http://download.opensuse.org/repositories/devel:/languages:/tcl/openSUSE_Leap_42.3/  tcl-Leap_42.3 && zypper addrepo https://download.opensuse.org/repositories/home:/danilochang/openSUSE_Leap_42.3/ danilo
RUN zypper --no-gpg-checks refresh && zypper --no-gpg-checks -n update
RUN zypper --no-gpg-checks -n install tcl tcllib tclvfs vectcl tls libgumbo1 tdom rl_json  tcl-trf tclcurl tclreadline memchan tcl-sugar tclsoap tclws                                                                          
COPY tclshrc /root/.tclshrc                                                                                     
CMD ["tclsh8.6"]

CMD ["tclsh8.6"] 讓我們如果不指定 /bin/bash,執行的時候就會直接進入 tclsh 的環境。需要注意的是,我從 tcl devel 和我自己的 repositories 下載檔案。


tclshrc 的內容:
if {$tcl_interactive} {
    package require tclreadline
    
    proc ::tclreadline::prompt1 {} {
        global env
        if {[catch {set pwd [pwd]} tmp]} {
            set pwd "unable to get pwd"
        }

        if [info exists env(HOME)] {
            regsub $env(HOME) $pwd "~" pwd
        }


        if [info exists env(USER)] {
            set user $env(USER)
        } else {
            set user tclsh
        }

        return "$user@[lindex [split [info hostname] "."] 0]:$pwd% "
    }
    
    ::tclreadline::Loop
}

再來使用 docker build 建立影像檔:
sudo docker build -t="ray2501/docker-tcl:devel" .

我們就可以執行建立的影像檔:
sudo docker run -t -i ray2501/docker-tcl:devel /bin/bash

執行的時候如果不指定執行 bash,就會直接執行 tclsh8.6:
sudo docker run -t -i ray2501/docker-tcl:devel

如果要存取本地的目錄並且對應到 docker 中的目錄,並且先執行 bash:
sudo docker run -t -i -v /home/danilo/Public/tclfiles:/root ray2501/docker-tcl:devel /bin/bash

這樣如果執行 /bin/bash 以後,可以在 bash 環境中使用 tclsh8.6 來執行 /home/danilo/Public/tclfiles 中的 tcl script 檔案(在 docker 中的目錄則為 /root)。

(* 或者是將 Tcl script 檔案使用 COPY 複製到 docker 影像檔以後,使用 CMD 來執行。總之,應該有更多的設定方法才對。)


如果要停止容器,使用下列的方式停止 (找出 CONTAINER-ID 以後使用 stop 停止):
sudo docker stop $(sudo docker ps -a -q)

然後再刪除 CONTAINER:
sudo docker rm $(sudo docker ps -a -q)

如果要刪除 Docker image,先列出目前的 image:
sudo docker images

然後再刪除要刪除的項目:
sudo docker rmi ray2501/docker-tcl:devel


這樣就完成了一次 openSUSE Tcl docker 環境的基本測試。如果需要參考更多的 Dockerfile,可以參考 docker-tcl


在建立一個基本的 Tcl 環境可以使用以後,再來建立一個 Wub server, 在我們的工作目錄下放置 wub 目錄和相關的檔案,再修改 wub/Wub/wub.vcl 的設定,
backend default {
    set backend.host = "0.0.0.0";
    set backend.port = "8080";
}

將 backend.host 修改為 docker 影像檔的網路設定值。再更新我們的 Dockerfile:
FROM opensuse:42.3
MAINTAINER Danilo Chang
RUN zypper addrepo http://download.opensuse.org/repositories/devel:/languages:/tcl/openSUSE_Leap_42.3/  tcl-Leap_42.3 && zypper addrepo https://download.opensuse.org/repositories/home:/danilochang/openSUSE_Leap_42.3/ danilo
RUN zypper --no-gpg-checks refresh && zypper --no-gpg-checks -n update
RUN zypper --no-gpg-checks -n install tcl tcllib tclvfs vectcl tls libgumbo1 tdom rl_json  tcl-trf tclcurl tclreadline memchan tcl-sugar tclsoap tclws which
COPY tclshrc /root/.tclshrc
COPY wub /root/wub
EXPOSE 8080
WORKDIR /root/wub
CMD ["tclsh8.6", "Wub.tcl"]

在工作目錄下新增一個檔案 .dockerignore,內容如下:
wub.log

再來使用 docker build 建立影像檔:
sudo docker build -t="ray2501/docker-wub:devel" .

如果建立成功,使用下面的方式執行(將本機的 8080 port 對應到 docker 容器的 8080 port):
sudo docker run -p 8080:8080 -d ray2501/docker-wub:devel

使用下面的命令觀察執行的情況:
sudo docker ps -l

如果要進入容器執行命令:
sudo docker run -t -i ray2501/docker-wub:devel /bin/bash

測試方式:
curl -i localhost:8080

或者是開啟瀏覽器瀏覽 http://localhost:8080

沒有留言: