diff --git a/Dockerfile b/Dockerfile index ea8cf68..7dfeaaf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ ARG NODEVER=20 RUN dnf install -y \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && \ dnf update -y && \ - dnf install -y wget procps cronie iproute nginx openssl git microdnf make gcc gcc-c++ && \ + dnf install -y wget procps cronie iproute nginx openssl git microdnf make gcc gcc-c++ tini && \ dnf group install -y 'Development Tools' && \ dnf clean all && \ rm -rf /var/cache/dnf /usr/share/doc /usr/share/man /usr/share/locale/* \ @@ -36,6 +36,7 @@ COPY ./examples/ /examples/ RUN echo "15 */12 * * * root /scripts/log-rotate.sh" >> /etc/crontab HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ - CMD wget --spider -q http://localhost/ || exit 1 + CMD bash -c ': /dev/null & + +# Start PM2 under tini so it becomes PID 1 (with proper signal forwarding +# and zombie reaping for nginx/crond/memcached children that reparent here). +# When pm2 exits (e.g. max_restarts exhausted), tini exits and Docker's +# restart policy brings the container back. +echo "Starting PM2 as user $user (under tini as PID 1)..." cd /home/$user/app -# Use su with login shell to ensure clean environment -su - $user -c "cd /home/$user/app && NODE_ENV=production pm2 start ecosystem.config.js --no-daemon" & - -# Give PM2 time to start -sleep 5 - -# Check if the app is running -echo "Checking PM2 status..." -su -c "pm2 status" $user - -# Follow logs -tail -f /home/$user/logs/nginx/* /home/$user/logs/nodejs/* - -exit 0 \ No newline at end of file +exec tini -- su - $user -c "cd /home/$user/app && NODE_ENV=production pm2 start ecosystem.config.js --no-daemon" \ No newline at end of file