Docker 使得在不同的系統和環境中部署應用變得更加簡單。本文會詳細介紹如何使用 Dockerfile 來建立一個運行 PHP 8 和 Apache 的容器,專為 CodeIgniter 4 設計。

Dockerfile 解釋

基礎映像檔

FROM php:8.0-apache

這行會從 Docker Hub 下載官方的 PHP 8.0 和 Apache 的映像檔。

Apache 設定

RUN a2enmod rewrite
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

這裡啟用了 Apache 的 rewrite 模組並設置了 ServerName

系統依賴和 PHP 擴展

RUN apt-get update -y && apt-get install -y ...
RUN docker-php-ext-configure gd --with-freetype --with-jpeg ...
RUN docker-php-ext-install -j "$(nproc)" pdo pdo_mysql mysqli opcache gd intl zip

這些指令安裝了系統依賴和必要的 PHP 擴展。

Composer 安裝

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

全局安裝 Composer。

PHP 配置

RUN set -ex; \
  { \
    echo "memory_limit = -1"; \
    ...
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

這部分為 Cloud Run 定制了 PHP 配置。

工作目錄和代碼複製

WORKDIR /var/www/html
COPY . ./
RUN chmod -R 777 writable
RUN cp .env_uat .env

設置工作目錄,複製代碼,並進行必要的權限和環境設置。

啟動腳本

RUN mkdir -p /scripts
RUN echo "sed -i 's/80/\${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf" > /scripts/startup.sh
RUN chmod +x /scripts/startup.sh
CMD ["sh", "/scripts/startup.sh"]

這裡創建了一個啟動腳本,它會在容器啟動時運行。

本地端使用

  1. 建立映像檔: 在 Dockerfile 所在的目錄執行 docker build -t my-php-app .
  2. 運行容器: docker run -p 8080:80 my-php-app
  3. 訪問應用: 打開瀏覽器,輸入 http://localhost:8080

注意事項

  • 確保本地端已安裝 Docker。
  • 如果運行在 Cloud Run,確保容器內的端口和 Cloud Run 配置的端口相匹配。

這樣,你就有了一個運行 PHP 8 和 CodeIgniter 4 的 Docker 容器!希望這篇文章對你有幫助。

最後補上完整內容

# Use the official PHP image.
FROM php:8.0-apache

# Enable mod_rewrite for Apache
RUN a2enmod rewrite

# Set ServerName to suppress Apache warning
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

# Install system dependencies and PHP extensions
RUN apt-get update -y \
    && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev zlib1g-dev libicu-dev zip unzip libzip-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-configure intl \
    && docker-php-ext-configure zip \
    && docker-php-ext-install -j "$(nproc)" pdo pdo_mysql mysqli opcache gd intl zip

# Install Composer globally
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Configure PHP for Cloud Run
RUN set -ex; \
  { \
    echo "; Cloud Run enforces memory & timeouts"; \
    echo "memory_limit = -1"; \
    echo "max_execution_time = 0"; \
    echo "; File upload at Cloud Run network limit"; \
    echo "upload_max_filesize = 32M"; \
    echo "post_max_size = 32M"; \
    echo "; Configure Opcache for Containers"; \
    echo "opcache.enable = On"; \
    echo "opcache.validate_timestamps = Off"; \
    echo "; Configure Opcache Memory (Application-specific)"; \
    echo "opcache.memory_consumption = 32"; \
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

# Set working directory and copy in custom code
WORKDIR /var/www/html
COPY . ./
# 將 writable 目錄設定為可寫入
RUN chmod -R 777 writable
# 複製檔案 .env_uat 為 .env
RUN cp .env_uat .env

# Point Apache to the 'public' directory
RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf

# Create a script to replace the port in Apache conf files
RUN mkdir -p /scripts
RUN echo "sed -i 's/80/\${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf" > /scripts/startup.sh
RUN echo 'cd /var/www/html' >> /scripts/startup.sh
RUN echo "php spark migrate" >> /scripts/startup.sh
RUN echo "apache2-foreground" >> /scripts/startup.sh
RUN chmod +x /scripts/startup.sh

# Configure PHP for development
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

# Use the startup script to start Apache
CMD ["sh", "/scripts/startup.sh"]
最後修改日期: 2023 年 8 月 29 日

作者