-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathDockerfile
More file actions
140 lines (121 loc) · 5.43 KB
/
Copy pathDockerfile
File metadata and controls
140 lines (121 loc) · 5.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# ----------------------------------------
# 第一阶段,拉取 node 基础镜像并安装依赖,执行构建
FROM docker.1ms.run/library/node:16-alpine AS builder
ARG BUILD_COUNTRY=""
WORKDIR /build
RUN if [ "x${BUILD_COUNTRY}" = "xCN" ]; then \
echo "using repo mirrors for ${BUILD_COUNTRY}"; \
npm config set registry https://registry.npmmirror.com; \
fi
COPY app/package.json app/package-lock.json* ./
RUN npm install
# spa build mode will clear ssr build data, run it first
COPY app/ /build/
RUN mkdir -p /app-ssr/ /app-static/ && \
npm run build && \
ls -al && \
cp -r .nuxt node_modules package* /app-ssr/ && \
npm run build-spa && \
cp -r dist nuxt.config.js package* /app-static/
# ----------------------------------------
# 第二阶段,构建环境(基于预构建的基础镜像,含系统包、python依赖及calibre补丁)
# 基础镜像构建:make build-base-multiarch
# ----------------------------------------
# 测试阶段 (--break-system-packages)
FROM docker.1ms.run/poxenstudio/mybooks_base:latest AS test
RUN pip install flake8 pytest --break-system-packages
COPY webserver/ /var/www/mybooks/webserver/
COPY tests/ /var/www/mybooks/tests/
CMD ["pytest", "/var/www/mybooks/tests"]
# ----------------------------------------
# 生产环境
FROM docker.1ms.run/poxenstudio/mybooks_base:latest AS production
ARG BUILD_COUNTRY="CN"
ARG GIT_VERSION=""
LABEL Author="horky <horky.chen@gmail.com>"
LABEL Thanks="Rex <talebook@foxmail.com>, oldiy <oldiy2018@gmail.com>"
LABEL org.opencontainers.image.title="mybooks" \
org.opencontainers.image.vendor="PoxenStudio" \
org.opencontainers.image.source="https://github.com/PoxenStudio/mybooks"
# set default language
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
ENV PUID=1000
ENV PGID=1000
# prepare dirs
RUN mkdir -p /data/log/nginx/ && \
mkdir -p /data/books/library && \
mkdir -p /data/books/extract && \
mkdir -p /data/books/upload && \
mkdir -p /data/books/imports && \
mkdir -p /data/books/convert && \
mkdir -p /data/books/progress && \
mkdir -p /data/books/settings && \
mkdir -p /data/books/logo && \
mkdir -p /data/books/avatar && \
mkdir -p /data/books/audios && \
mkdir -p /data/books/ssl && \
mkdir -p /var/www/mybooks/ && \
mkdir -p /var/www/myreader/ && \
chmod a+w -R /data/log /data/books /var/www
COPY server.py /var/www/mybooks/
COPY docker/ /var/www/mybooks/docker/
COPY webserver/ /var/www/mybooks/webserver/
COPY conf/nginx/ssl.* /data/books/ssl/
COPY conf/nginx/mybooks.conf /etc/nginx/conf.d/
COPY conf/supervisor/mybooks.conf /etc/supervisor/conf.d/
COPY --from=builder /app-static/ /var/www/mybooks/app/
COPY --from=builder /app-static/dist/logo/ /data/books/logo/
COPY --from=builder /app-static/dist/avatar/ /data/books/avatar/
# MyReader(内嵌阅读器)— see document/MyReader_Embedded_WebApp.md in the
# myreader repo. myreader is a separate git repo/pnpm monorepo, so its build
# isn't part of this multi-stage build; instead, before running `docker
# build` here, produce a standalone Next.js server bundle and stage it at
# myreader-dist/ (gitignored) in this repo root:
#
# cd ../myreader/app && pnpm install && pnpm build-docker-dist
# rsync -a --delete myreader-dist/ ../../mybooks/myreader-dist/
#
# (`pnpm build-docker-dist` wraps `pnpm build-web-standalone` and the
# assembly steps — see myreader/app/scripts/build-docker-dist.sh.)
#
# `output: 'standalone'` traces the actually-used dependency graph into
# node_modules (see next.config.mjs), so this works even though app/ has no
# lockfile of its own (it's a pnpm workspace member) — no need to reinstall
# or resolve the monorepo inside this Dockerfile. myreader-dist/ keeps the
# nested layout Next's tracer produces (node_modules/ at this level, the
# actual app under app/) rather than flattening it — app/node_modules
# contains *relative* symlinks (e.g. `next -> ../../node_modules/.pnpm/...`)
# that assume this exact two-level nesting and break if flattened. Run as
# `node app/server.js`, not `node server.js` (see conf/supervisor/mybooks.conf).
COPY myreader-dist/ /var/www/myreader/
COPY release_notes.txt /var/www/mybooks/app/dist/static/
RUN rm -f /etc/nginx/conf.d/default.conf /var/www/html -rf && \
cd /var/www/mybooks/ && \
ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && \
echo ${TZ} > /etc/timezone && \
echo "VERSION = \"$GIT_VERSION\"" > webserver/version.py && \
echo 'settings = {}' > /data/books/settings/auto.py && \
chmod a+w /data/books/settings/auto.py && \
calibredb add --library-path=/data/books/library/ -r docker/book/ && \
python3 server.py --syncdb && \
python3 server.py --update-config && \
find webserver -name "*.pyc" -type f -delete && \
rm -rf app/src && \
rm -rf app/dist/logo && \
ln -s /data/books/logo app/dist/logo && \
rm -rf app/dist/avatar && \
ln -s /data/books/avatar app/dist/avatar && \
ln -s /data/books/audios app/dist/audios && \
mkdir -p /prebuilt/ && \
mv /data/* /prebuilt/ && \
chmod +x /var/www/mybooks/docker/start.sh
EXPOSE 80 443
VOLUME ["/data"]
CMD ["/var/www/mybooks/docker/start.sh"]
# ----------------------------------------
# 生产环境(server side render版)
FROM production AS production-ssr
COPY conf/nginx/server-side-render.conf /etc/nginx/conf.d/mybooks.conf
COPY conf/supervisor/server-side-render.conf /etc/supervisor/conf.d/mybooks.conf
COPY --from=builder /app-ssr/ /var/www/mybooks/app/