Dockerfile 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # ----------------------------------------
  2. # 第一阶段,拉取 node 基础镜像并安装依赖,执行构建
  3. FROM node:16-alpine as builder
  4. ARG BUILD_COUNTRY=""
  5. LABEL Author="Rex <talebook@foxmail.com>"
  6. LABEL Thanks="oldiy <oldiy2018@gmail.com>"
  7. WORKDIR /app
  8. RUN if [ "x${BUILD_COUNTRY}" = "xCN" ]; then \
  9. echo "using repo mirrors for ${BUILD_COUNTRY}"; \
  10. npm config set registry http://mirrors.tencent.com/npm/; \
  11. fi
  12. COPY ["app/package.json", "app/package-lock.json*", "/app/"]
  13. RUN npm install
  14. # spa build mode will clear ssr build data, run it first
  15. COPY app/ /app/
  16. RUN npm run build
  17. # ----------------------------------------
  18. # 第二阶段,构建环境
  19. FROM talebook/calibre-docker as server
  20. ARG BUILD_COUNTRY=""
  21. # Set mirrors in china
  22. RUN if [ "x${BUILD_COUNTRY}" = "xCN" ]; then \
  23. echo "using repo mirrors for ${BUILD_COUNTRY}"; \
  24. sed 's@deb.debian.org/debian@mirrors.aliyun.com/debian@' -i /etc/apt/sources.list; \
  25. pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/; \
  26. fi
  27. # install envsubst
  28. RUN apt-get update && apt-get install -y gettext
  29. # intall nodejs for nuxtjs server side render
  30. RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
  31. RUN apt-get install -y nodejs
  32. # install python packages
  33. COPY ["requirements.txt", "/tmp/"]
  34. RUN pip install -r /tmp/requirements.txt
  35. # ----------------------------------------
  36. # 测试阶段
  37. FROM server as test
  38. RUN pip install flake8 pytest
  39. COPY webserver/ /var/www/talebook/webserver/
  40. COPY tests/ /var/www/talebook/tests/
  41. CMD ["pytest", "/var/www/talebook/tests"]
  42. # ----------------------------------------
  43. # 生产环境
  44. FROM server as production
  45. ARG GIT_VERSION=""
  46. # prepare dirs
  47. RUN mkdir -p /data/log/nginx/ && \
  48. mkdir -p /data/books/library && \
  49. mkdir -p /data/books/extract && \
  50. mkdir -p /data/books/upload && \
  51. mkdir -p /data/books/imports && \
  52. mkdir -p /data/books/convert && \
  53. mkdir -p /data/books/progress && \
  54. mkdir -p /data/books/settings && \
  55. mkdir -p /data/books/logo && \
  56. mkdir -p /data/books/ssl && \
  57. mkdir -p /var/www/talebook/ && \
  58. chmod a+w -R /data/log /data/books /var/www
  59. COPY . /var/www/talebook/
  60. COPY conf/nginx/ssl.* /data/books/ssl/
  61. COPY conf/nginx/talebook.conf /etc/nginx/conf.d/talebook.conf
  62. COPY conf/supervisor/talebook.conf /etc/supervisor/conf.d/
  63. COPY --from=builder /app/.nuxt/ /var/www/talebook/app/.nuxt/
  64. COPY --from=builder /app/node_modules/ /var/www/talebook/app/node_modules/
  65. COPY --from=builder /app/src/static/ /var/www/talebook/app/dist/
  66. COPY --from=builder /app/src/static/logo/ /data/books/logo/
  67. RUN rm -f /etc/nginx/sites-enabled/default /var/www/html -rf && \
  68. cd /var/www/talebook/ && \
  69. echo "VERSION = \"$GIT_VERSION\"" > webserver/version.py && \
  70. echo 'settings = {}' > /data/books/settings/auto.py && \
  71. chmod a+w /data/books/settings/auto.py && \
  72. calibredb add --library-path=/data/books/library/ -r docker/book/ && \
  73. python3 server.py --syncdb && \
  74. python3 server.py --update-config && \
  75. rm -f webserver/*.pyc && \
  76. rm -rf app/src && \
  77. rm -rf app/dist/logo && \
  78. ln -s /data/books/logo app/dist/logo && \
  79. mkdir -p /prebuilt/ && \
  80. mv /data/* /prebuilt/ && \
  81. chmod +x /var/www/talebook/docker/start.sh
  82. EXPOSE 80 443
  83. VOLUME ["/data"]
  84. CMD ["/var/www/talebook/docker/start.sh"]