Grav 深夜折腾

在已经成功搭建起 dokuwiki 的基础上,本以为搭建同为 php 的 grav 会信手拈来,没想到折腾到半夜😂 ,必须要纪念一下。

主要遇到的几个问题:

  • grav 多依赖的一个 php 的库:php5-curl
  • 阿里云主机直接通过grav的链接下载需要翻墙
  • 阿里云裸机无法直接解压 .zip 文件
  • 双层 nginx 代理,需要在内层添加以下内容,告知 grav 一些事情… fastcgi_param HTTP_HOST www.example.com; fastcgi_param HTTPS 'on';

总之,功夫不负有心人,总算搭建起来了。大致的 Dockerfile 如下:

FROM ubuntu:14.04
MAINTAINER panezhang <njuzp08@gmail.com>

COPY grav-admin-v1.1.17.tar.gz /grav.tar.gz

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \
    \
    # install grav
    mkdir /grav && \
    tar -xzvf /grav.tar.gz -C /grav --strip-components 1 && \
    rm /grav.tar.gz && \
    chown -R www-data:www-data /grav && \
    \
    # install deps & clean
    apt-get update && \
    apt-get -y upgrade && \
    apt-get -y install nginx php5-fpm php5-gd php5-curl php5-cli wget && \
    apt-get clean autoclean && \
    apt-get autoremove && \
    rm -rf /var/lib/{apt,dpkg,cache,log} && \
    \
    # config php & nginx
    echo "cgi.fix_pathinfo = 0;" >> /etc/php5/fpm/php.ini && \
    rm /etc/nginx/sites-enabled/*

COPY nginx.conf /etc/nginx/nginx.conf
COPY grav.conf /etc/nginx/sites-enabled/

EXPOSE 80
VOLUME [ \
    "/grav/user", \
    "/var/log/" \
]

CMD /usr/sbin/php5-fpm && /usr/sbin/nginx

Ref:https://learn.getgrav.org/


以上已经成为了旧的版本。

FROM ubuntu:14.04
MAINTAINER panezhang <njuzp08@gmail.com>

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \
    # install deps & clean
    apt-get update && \
    apt-get -y upgrade && \
    apt-get -y install nginx php5-fpm php5-gd php5-curl php5-cli wget && \
    apt-get clean autoclean && \
    apt-get autoremove && \
    rm -rf /var/lib/{apt,dpkg,cache,log} && \
    \
    # config php & nginx
    echo "cgi.fix_pathinfo = 0;" >> /etc/php5/fpm/php.ini && \
    rm /etc/nginx/sites-enabled/*

COPY nginx.conf /etc/nginx/nginx.conf
COPY grav.conf /etc/nginx/sites-enabled/

# install grav
COPY grav-admin-v1.2.0.tar.gz /grav.tar.gz
RUN mkdir /grav && \
    tar -xzvf /grav.tar.gz -C /grav --strip-components 1 && \
    rm /grav.tar.gz && \
    chown -R www-data:www-data /grav

EXPOSE 80
VOLUME [ \
    "/grav/user", \
    "/var/log/" \
]

CMD /usr/sbin/php5-fpm && /usr/sbin/nginx

虽然在写 Dockerfile 的时候,要尽可能的使层数减少,但之前忽略了一点,如果某些部分需要升级,但基础的依赖部分根本不需要动的话,把整个安装过程合成一层,就非常不合理。一是不同的镜像之间,无法共用相同的层;二是重新 build 的时候,每次都要从头开始。

故按照现在这样做拆分,将基础依赖部分单独做一层。安装 grav 单独做一层。这样,下次 grav 升级的时候,build 的时候只会涉及到这一层,最大程度的复用了。