Php Laravel完全码头自动化

Php Laravel完全码头自动化,php,laravel,docker,docker-compose,Php,Laravel,Docker,Docker Compose,确实有很多Laravel/PHP docker教程,但是经过几天的搜索,我找不到一个完整、干净、自动的方法来对其进行拼接,而无需其他触摸,只需随时使用即可 这对我来说意味着: 创建所需的容器 从.env.example创建.env文件 创建数据库(与.env文件相同) 设置文件夹权限 安装php依赖项 生成应用程序密钥 迁移 种子 我与其他开发人员一起参与了一个特定的项目,他们不知道,也不想知道PHP/Laravel,但他们希望它可以随时使用,因为我不是docker大师,我需要实现这个,并在

确实有很多Laravel/PHP docker教程,但是经过几天的搜索,我找不到一个完整、干净、自动的方法来对其进行拼接,而无需其他触摸,只需随时使用即可

这对我来说意味着:

  • 创建所需的容器
  • .env.example创建.env文件
  • 创建数据库(与.env文件相同)
  • 设置文件夹权限
  • 安装php依赖项
  • 生成应用程序密钥
  • 迁移
  • 种子
我与其他开发人员一起参与了一个特定的项目,他们不知道,也不想知道PHP/Laravel,但他们希望它可以随时使用,因为我不是docker大师,我需要实现这个,并在他们克隆我的repo并使用
docker compose
后立即使用它

我已使用以下服务成功设置my docker服务:

  • 马里亚布
  • nginx
  • php/laravel应用程序
但缺少的是自动化,很可能还有一些改进

因此,假设我们正在使用最新的Laravel 8全新安装,我有以下文件:

Dockerfile

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
to
DB_HOST=127.0.0.1
解决此问题