为什么 docker-compose 中的 caddy + php-fpm 配置不起作用?

Vic*_*tor 6 php laravel docker docker-compose

我正在尝试在本地计算机上设置一个由 caddy + PHP 组成的开发环境。

docker-compose.yaml:

version: '3'

services:
    app:
        build:
            context: .
        container_name: app
        restart: unless-stopped
        tty: true
        environment:
            SERVICE_NAME: app
            SERVICE_TAGS: dev
        volumes:
            - ./:/var/www
            - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini

    webserver:
        image: caddy
        container_name: webserver
        restart: unless-stopped
        tty: true
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./:/srv
            - ./docker/caddy/Caddyfile/:/etc/caddy/Caddyfile

    db:
        image: mysql:8.0
        container_name: db
        restart: unless-stopped
        tty: true
        ports:
            - "3306:3306"
        environment:
            MYSQL_USER: pingr
            MYSQL_DB: pingr
            MYSQL_PASSWORD: pingr
            MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
        volumes:
            - dbdata:/var/lib/mysql

volumes:
    dbdata:
        driver: local
Run Code Online (Sandbox Code Playgroud)

应用程序服务的 Dockerfile:

FROM php:7.4-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libzip-dev \
    libicu-dev

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl intl
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd

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

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Run Code Online (Sandbox Code Playgroud)

球童文件:

:80 {
    root * /srv/public
    php_fastcgi app:9000

    file_server /uploads/*
    encode gzip zstd
}
Run Code Online (Sandbox Code Playgroud)

当我打开 http://localhost 时,这会导致“找不到文件”。

我 100% 确定问题是因为 caddyfile 中的 root 以及应用程序和网络服务器服务中的卷不同。

当我让它们相同时,看起来好像有效。而且,我选择哪条路并不重要,我可以拥有/var/bar例如。

但后来我不明白它是如何工作的。

  1. 在球童图像中,他们说工作目录是/srv. 据我所知,这是应该放置站点文件的地方。

  2. 在 Caddyfile 中,我指定 Caddy 应该查看/srb/public(因为我使用 Laravel)..

  3. 在 php-fpm 图像中,他们说工作目录是/var/www. 这意味着..我不确定这是什么意思。如果我不使用 Docker,那么在我的本地计算机中我将拥有 caddy + php,只有 caddy“知道”源 .php 文件所在的位置。如果请求需要 .php 文件,Caddy 会将其代理给 php。也许我根本不需要这里的卷?

gre*_*emo 1

我很难理解同样的概念。我觉得:

  1. Caddyfile说文档根目录是/srv,因此从该目录提供静态文件,并且您需要将项目(公共)目录绑定挂载到 caddy 服务
  2. 当您请求 PHP 文件时,Caddy 会将请求代理到 php-fpm unix 套接字或 TCP/IP(在您的情况下是后者)
  3. php-fpm 如何找到源文件?球童正在超车DOCUMENT_ROOT(设置为/srv)和SCRIPT_FILENAME(设置为/srv/index.php

..这就是为什么您需要将项目公共目录也绑定安装到 php 服务,但/srv不是绑定到 /var/www.