mirror of
https://github.com/whyour/qinglong.git
synced 2026-06-13 06:16:12 +08:00
fix: support non-root user container startup
- Guard /etc/resolv.conf write and crond behind root check in entrypoint;
non-root containers now stay alive via 'tail -f /dev/null' instead of
failing when crond exits with EPERM
- Set PM2_HOME to ${QL_DIR}/data/.pm2 (inside the data volume) so PM2
does not fall back to /root/.pm2, which is inaccessible to non-root users
- Pre-create /ql/.tmp and /ql/shell/preload during image build and make
them world-writable so non-root processes can write runtime files
- Wrap directory creation in initFile.ts with try/catch + recursive:true
so a permission error on ~/.ssh (HOME=/root for non-root user) is logged
as a warning instead of crashing the server init
This commit is contained in:
parent
d25340a857
commit
cb93a1f0d3
|
|
@ -104,7 +104,11 @@ const files = [
|
||||||
export default async () => {
|
export default async () => {
|
||||||
for (const dirPath of directories) {
|
for (const dirPath of directories) {
|
||||||
if (!(await fileExist(dirPath))) {
|
if (!(await fileExist(dirPath))) {
|
||||||
await fs.mkdir(dirPath);
|
try {
|
||||||
|
await fs.mkdir(dirPath, { recursive: true });
|
||||||
|
} catch (err: any) {
|
||||||
|
Logger.warn(`Unable to create directory ${dirPath}: ${err.message}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,11 +65,14 @@ RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
||||||
&& git clone --depth=1 -b ${QL_BRANCH} https://github.com/${QL_MAINTAINER}/qinglong-static.git /static \
|
&& git clone --depth=1 -b ${QL_BRANCH} https://github.com/${QL_MAINTAINER}/qinglong-static.git /static \
|
||||||
&& mkdir -p ${QL_DIR}/static \
|
&& mkdir -p ${QL_DIR}/static \
|
||||||
&& cp -rf /static/* ${QL_DIR}/static \
|
&& cp -rf /static/* ${QL_DIR}/static \
|
||||||
&& rm -rf /static
|
&& rm -rf /static \
|
||||||
|
&& mkdir -p ${QL_DIR}/.tmp ${QL_DIR}/shell/preload \
|
||||||
|
&& chmod -R a+w ${QL_DIR}/.tmp ${QL_DIR}/shell/preload ${QL_DIR}/static
|
||||||
|
|
||||||
ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
|
ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
|
||||||
PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
|
PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
|
||||||
PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 \
|
PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 \
|
||||||
|
PM2_HOME=${QL_DIR}/data/.pm2 \
|
||||||
HOME=/root
|
HOME=/root
|
||||||
|
|
||||||
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \
|
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \
|
||||||
|
|
|
||||||
|
|
@ -65,11 +65,14 @@ RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
||||||
&& git clone --depth=1 -b ${QL_BRANCH} https://github.com/${QL_MAINTAINER}/qinglong-static.git /static \
|
&& git clone --depth=1 -b ${QL_BRANCH} https://github.com/${QL_MAINTAINER}/qinglong-static.git /static \
|
||||||
&& mkdir -p ${QL_DIR}/static \
|
&& mkdir -p ${QL_DIR}/static \
|
||||||
&& cp -rf /static/* ${QL_DIR}/static \
|
&& cp -rf /static/* ${QL_DIR}/static \
|
||||||
&& rm -rf /static
|
&& rm -rf /static \
|
||||||
|
&& mkdir -p ${QL_DIR}/.tmp ${QL_DIR}/shell/preload \
|
||||||
|
&& chmod -R a+w ${QL_DIR}/.tmp ${QL_DIR}/shell/preload ${QL_DIR}/static
|
||||||
|
|
||||||
ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
|
ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
|
||||||
PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
|
PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
|
||||||
PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 \
|
PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 \
|
||||||
|
PM2_HOME=${QL_DIR}/data/.pm2 \
|
||||||
HOME=/root
|
HOME=/root
|
||||||
|
|
||||||
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \
|
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,10 @@ log_with_style() {
|
||||||
printf "\n[%s] [%7s] %s\n" "${timestamp}" "${level}" "${message}"
|
printf "\n[%s] [%7s] %s\n" "${timestamp}" "${level}" "${message}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fix DNS resolution issues in Alpine Linux
|
# Fix DNS resolution issues in Alpine Linux (requires root)
|
||||||
# Alpine uses musl libc which has known DNS resolver issues with certain domains
|
# Alpine uses musl libc which has known DNS resolver issues with certain domains
|
||||||
# Adding ndots:0 prevents unnecessary search domain appending
|
# Adding ndots:0 prevents unnecessary search domain appending
|
||||||
if [ -f /etc/alpine-release ]; then
|
if [ "$(id -u)" = "0" ] && [ -f /etc/alpine-release ]; then
|
||||||
if ! grep -q "^options ndots:0" /etc/resolv.conf 2>/dev/null; then
|
if ! grep -q "^options ndots:0" /etc/resolv.conf 2>/dev/null; then
|
||||||
echo "options ndots:0" >> /etc/resolv.conf
|
echo "options ndots:0" >> /etc/resolv.conf
|
||||||
log_with_style "INFO" "🔧 0. 已配置 DNS 解析优化 (ndots:0)"
|
log_with_style "INFO" "🔧 0. 已配置 DNS 解析优化 (ndots:0)"
|
||||||
|
|
@ -50,6 +50,11 @@ fi
|
||||||
|
|
||||||
log_with_style "SUCCESS" "🎉 容器启动成功!"
|
log_with_style "SUCCESS" "🎉 容器启动成功!"
|
||||||
|
|
||||||
|
if [ "$(id -u)" = "0" ]; then
|
||||||
crond -f >/dev/null
|
crond -f >/dev/null
|
||||||
|
else
|
||||||
|
# crond requires root in Alpine; keep container alive without it
|
||||||
|
exec tail -f /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user