我试图在我的本地机器上设置一个由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。也许我根本不需要一个卷在这里?
1条答案
按热度按时间v8wbuo2f1#
我很难理解这个概念。我想:
1.对于
Caddyfile
,您说文档根目录是/srv
,因此静态文件从该目录提供,您需要将项目(公共)目录绑定挂载到caddy服务1.当您请求PHP文件时,Caddy将把请求代理到php-fpm unix套接字或TCP/IP(在您的情况下是后者)
DOCUMENT_ROOT
(设置为/srv
)和SCRIPT_FILENAME
(设置为/srv/index.php
)..这就是为什么你需要绑定挂载你的项目公共目录到php服务,但
/srv
而不是/var/www
。