制作 leanote docker 鏡像


leanote 使用 mongodb 存儲數據,如果把 mongodb 單獨做成一個鏡像,初始化數據時比較麻煩,所以最后還是決定把 mongodb 和 leanote 放到同一個鏡像里邊。

docker容器啟動后,必須有一個進程前台運行,這個前台進程結束時docker容器結束,docker stop 時會給前台進程發信號,所以前台進程可以正常結束,而后台進程不會收到結束信號,前台進程結束時后台進程會被強制結束。

如果只是簡單的啟動 mongodb 和 leanote,mongodb 后台運行,leanote前台運行,結束容器的時候,leanote會正常結束,而mongodb則會非法結束,引起mongodb數據不一致。

其中一個解決辦法就是使用supervisor作為前台進程,其他進程作為supervisor的子進程。

構建 supervisor 鏡像

FROM ubuntu:14.04
MAINTAINER LiangJunliang<noright0@163.com>

ADD sources.list /etc/apt/

RUN apt-get update && \
    apt-get install -y supervisor

CMD [ "/bin/bash" ]

其中sources.list使用國內源。

docker build -t ljl/supervisor:1.0 --rm --no-cache .

-t 生成的鏡像名稱 --rm 生成成功后刪除中間鏡像 --no-cache 不使用之前生成后緩存的中間鏡像 注意命令后邊跟的.,表示當前目錄

構建 leanote 鏡像

鏡像內包含 mongodb 和 leanote。 使用ADD指令添加*.tar.gz時會自動解壓。

# ljl/leanote:2.0
# with mongodb

FROM ljl/supervisor:1.0
MAINTAINER LiangJunliang<noright0@163.com>

ADD init.sh /root/init.sh
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD leanote-linux-amd64-v2.0.bin.tar.gz /root/
ADD mongodb-linux-x86_64-ubuntu1404-3.2.0.tgz /root/

RUN mkdir -p /root/db && \
    cd /root && \
    mv mongodb-linux-x86_64-ubuntu1404-3.2.0 mongodb && \
    mkdir -p /root/conf_bak && \
    cp /root/leanote/conf/* /root/conf_bak && \
    chmod a+x /root/init.sh && \
    chmod a+x /root/leanote/bin/run.sh

EXPOSE 9000

CMD ["/usr/bin/supervisord"]

supervisord.conf里配置啟動的進程,mongodb啟動時指定數據庫文件目錄,leanote啟動時先運行init.sh,再運行run.sh

[supervisord]
nodaemon=true

[program:mongodb]
command=/root/mongodb/bin/mongod --dbpath /root/db

[program:leanote]
command=/bin/bash -c "/root/init.sh && /root/leanote/bin/run.sh"

init.sh初始化數據庫。通過判斷是否存在文件/root/db/already-init-db來確定是否需要初始化數據庫。數據庫初始化時創建該文件。

生成鏡像時對conf目錄進行了備份,如果文件/root/leanote/conf/app.conf不存在,則說明容器啟動時將conf目錄作為數據卷掛載到了其他地方,這時就從備份文件恢復配置文件。

#!/bin/bash
#set -m

# 如果數據庫未初始化,則初始化數據庫
if [ ! -f "/root/db/already-init-db" ] ; then
    touch /root/db/already-init-db
    /root/mongodb/bin/mongorestore -h localhost -d leanote --dir /root/leanote/mongodb_backup/leanote_install_data/
fi

# 如果配置文件不存在,則復制配置文件
if [ ! -f "/root/leanote/conf/app.conf" ] ; then
    cp /root/conf_bak/* /root/leanote/conf/
fi

編譯生成鏡像

docker build -t ljl/leanote:2.0 --rm --no-cache .

啟動鏡像

第一次啟動。

三個目錄,一個存放mongodb數據庫文件,一個存放leanote配置文件,一個存放leanote附件。一個端口9000,用於訪問leanote。

docker run --name leanote -d -v /srv/leanote/db:/root/db -v /srv/leanote/conf/:/root/leanote/conf/ -v /srv/leanote/files:/root/leanote/files -p 9000:9000 ljl/leanote:2.0

啟動容器

docker start leanote

停止容器

docker stop leanote

查看容器輸出

docker logs leanote

其他

安裝docker

wget -qO- https://get.docker.com/ | sudo sh

supervisor 子進程日志

supervisor子進程輸出至

/var/log/supervisor/

進入容器

docker exec -it leanote /bin/bash

問題

容器第一次啟動時leanote會退出,再次啟動容器就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM