# syntax=docker/dockerfile:1 # check=error=true # This Dockerfile is designed for Git-based deployment with Kamal # It pulls code from Git during deployment and uses external volumes for code, build artifacts, and data # Make sure RUBY_VERSION matches the Ruby version in .ruby-version FROM ruby:3.2.2 # Rails app lives here WORKDIR /rails # Install base packages including Git for code pulling RUN apt-get update -qq && \ apt-get install --no-install-recommends -y \ curl \ libjemalloc2 \ libvips \ sqlite3 \ nodejs \ npm \ netcat-openbsd \ git \ build-essential \ pkg-config \ ca-certificates \ && rm -rf /var/lib/apt/lists /var/cache/apt/archives # Set production environment and optimize memory usage ENV RAILS_ENV="production" \ BUNDLE_DEPLOYMENT="1" \ BUNDLE_PATH="/bundle" \ BUNDLE_WITHOUT="development:test" \ BUNDLE_JOBS="4" \ BUNDLE_RETRY="3" \ MALLOC_ARENA_MAX="2" \ LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" \ JEMALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:30000,muzzy_decay_ms:30000" # Create directories for mounted volumes RUN mkdir -p \ /rails/code \ /rails/storage \ /rails/public/uploads \ /rails/public/assets \ /rails/public/vite \ /rails/node_modules \ /rails/tmp \ /rails/log \ /rails/tmp/pids \ /rails/tmp/cache \ /rails/tmp/sockets \ /bundle # Declare volumes for persistent storage VOLUME ["/root/.ssh", "/rails/code", "/rails/storage", "/rails/public/uploads", "/rails/public/vite", "/rails/node_modules", "/rails/log", "/rails/tmp", "/bundle"] # Copy entrypoint script COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint # 为rails用户准备环境,但仍使用root运行(为了访问SSH密钥) RUN groupadd --system --gid 1000 rails && \ useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \ chown -R rails:rails /rails # 注释掉USER指令,使用root用户运行 # USER 1000:1000 # Entrypoint pulls code, installs dependencies, and prepares the application ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start server via Rails default port 3000 EXPOSE 3000 # 添加健康检查,使用专门的健康检查端点 # 增加start-period到120秒,给应用更多启动时间 HEALTHCHECK --interval=10s --timeout=5s --start-period=120s --retries=10 \ CMD curl -f http://localhost:3000/health_check || exit 1 # 使用正确的路径启动Rails服务器,并指定端口为3000 CMD ["/rails/code/bin/rails", "server", "-p", "3000", "-b", "0.0.0.0"]