制做 leanote docker 镜像

leanote 使用 mongodb 存储数据,若是把 mongodb 单独作成一个镜像,初始化数据时比较麻烦,因此最后仍是决定把 mongodb 和 leanote 放到同一个镜像里边。html

docker容器启动后,必须有一个进程前台运行,这个前台进程结束时docker容器结束,docker stop 时会给前台进程发信号,因此前台进程能够正常结束,然后台进程不会收到结束信号,前台进程结束时后台进程会被强制结束。linux

若是只是简单的启动 mongodb 和 leanote,mongodb 后台运行,leanote前台运行,结束容器的时候,leanote会正常结束,而mongodb则会非法结束,引发mongodb数据不一致。mongodb

其中一个解决办法就是使用supervisor做为前台进程,其余进程做为supervisor的子进程。docker

构建 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 不使用以前生成后缓存的中间镜像
注意命令后边跟的.,表示当前目录ubuntu

构建 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.shbash

[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来肯定是否须要初始化数据库。数据库初始化时建立该文件。markdown

生成镜像时对conf目录进行了备份,若是文件/root/leanote/conf/app.conf不存在,则说明容器启动时将conf目录做为数据卷挂载到了其余地方,这时就从备份文件恢复配置文件。app

#!/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会退出,再次启动容器就行了。

posted on 2016-07-06 12:17 №冥王星 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/noright/p/5646477.html