Php Laravel完全码头自动化
确实有很多Laravel/PHP docker教程,但是经过几天的搜索,我找不到一个完整、干净、自动的方法来对其进行拼接,而无需其他触摸,只需随时使用即可 这对我来说意味着:Php Laravel完全码头自动化,php,laravel,docker,docker-compose,Php,Laravel,Docker,Docker Compose,确实有很多Laravel/PHP docker教程,但是经过几天的搜索,我找不到一个完整、干净、自动的方法来对其进行拼接,而无需其他触摸,只需随时使用即可 这对我来说意味着: 创建所需的容器 从.env.example创建.env文件 创建数据库(与.env文件相同) 设置文件夹权限 安装php依赖项 生成应用程序密钥 迁移 种子 我与其他开发人员一起参与了一个特定的项目,他们不知道,也不想知道PHP/Laravel,但他们希望它可以随时使用,因为我不是docker大师,我需要实现这个,并在
- 创建所需的容器
- 从.env.example创建.env文件
- 创建数据库(与.env文件相同)
- 设置文件夹权限
- 安装php依赖项
- 生成应用程序密钥
- 迁移
- 种子
docker compose
后立即使用它
我已使用以下服务成功设置my docker服务:
- 马里亚布
- nginx
- php/laravel应用程序
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/my-project
COPY ./docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
...
APP_KEY=
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=someuser
DB_PASSWORD=somepw
...
docker compose.yml
version: '3'
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "80:80"
volumes:
- '.:/var/www/my-project'
- './docker/nginx/default.conf:/etc/nginx/conf.d/default.conf'
depends_on:
- db
- app
db:
container_name: db
image: mariadb:10.3.23
ports:
- '3306:3306'
environment:
MYSQL_DATABASE: my_db
MYSQL_USER: someuser
MYSQL_PASSWORD: somepw
MYSQL_ROOT_PASSWORD: somepw
volumes:
- ./docker/dump:/docker-entrypoint-initdb.d
app:
build: .
container_name: app
volumes:
- '.:/var/www/my-project'
depends_on:
- db
ports:
- '9000:9000'
CREATE DATABASE IF NOT EXISTS my_db;
GRANT ALL PRIVILEGES ON my_db.* TO 'someuser' identified by 'somepw';
docker/dump/database.sql
version: '3'
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "80:80"
volumes:
- '.:/var/www/my-project'
- './docker/nginx/default.conf:/etc/nginx/conf.d/default.conf'
depends_on:
- db
- app
db:
container_name: db
image: mariadb:10.3.23
ports:
- '3306:3306'
environment:
MYSQL_DATABASE: my_db
MYSQL_USER: someuser
MYSQL_PASSWORD: somepw
MYSQL_ROOT_PASSWORD: somepw
volumes:
- ./docker/dump:/docker-entrypoint-initdb.d
app:
build: .
container_name: app
volumes:
- '.:/var/www/my-project'
depends_on:
- db
ports:
- '9000:9000'
CREATE DATABASE IF NOT EXISTS my_db;
GRANT ALL PRIVILEGES ON my_db.* TO 'someuser' identified by 'somepw';
docker/nginx/default.conf
server {
listen 80;
index index.php index.html;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/my-project/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
.env.example
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/my-project
COPY ./docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
...
APP_KEY=
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=someuser
DB_PASSWORD=somepw
...
entrypoint.sh
#!/usr/bin/env sh
composer install
mv .env.example .env
php artisan key:generaate
php artisan migrate
php artisan db:seed
...
#is it ok to pun npm i && npm run dev here ?
可以看出,为了创建数据库,我尝试创建一个入口点,该入口点应该在app之前运行,最后运行另一个app入口点,我应该在其中处理其他命令
使用这些设置,app
(php)容器就像一个代理。真的有必要吗
最后,我得到一个SQLSTATE[HY000][2002]连接被拒绝的错误
如何以更简单、更干净、更好的方式实现这一总体自动化?DB_HOST=DB
toDB_HOST=127.0.0.1
解决此问题