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

r6hnlfcb  于 2023-03-24  发布在  Docker
关注(0)|答案(1)|浏览(184)

我试图在我的本地机器上设置一个由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

应用服务的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"]

辅助文件:

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

    file_server /uploads/*
    encode gzip zstd
}

打开http://localhost时出现“File not found”。

我100%确定问题是因为caddyfile中的root和应用程序和Web服务器服务中的卷是不同的。
当我让它们相同时,看起来它工作了。而且,我甚至不在乎我选择哪条路径,例如我可以有/var/bar
但我不明白这是怎么回事。
1.在caddy图像中,他们说工作目录是/srv。所以我得到它,这是网站文件应该放置的地方。
1.在Caddyfile中,我指定Caddy应该查看/srb/public(因为我使用Laravel)。
1.在php-fpm镜像中,他们说工作目录是/var/www。这意味着..我不知道这是什么意思。如果我不使用Docker,那么在我的本地机器上,我会有caddy + php,只有caddy“知道”源.php文件的位置。如果请求要求一个.php文件,Caddy将其代理到php。也许我根本不需要一个卷在这里?

v8wbuo2f

v8wbuo2f1#

我很难理解这个概念。我想:
1.对于Caddyfile,您说文档根目录是/srv,因此静态文件从该目录提供,您需要将项目(公共)目录绑定挂载到caddy服务
1.当您请求PHP文件时,Caddy将把请求代理到php-fpm unix套接字或TCP/IP(在您的情况下是后者)

  1. php-fpm如何找到源文件?Caddy传递DOCUMENT_ROOT(设置为/srv)和SCRIPT_FILENAME(设置为/srv/index.php
    ..这就是为什么你需要绑定挂载你的项目公共目录到php服务,但/srv而不是/var/www

相关问题