Php 503“;“服务不可用”;Docker容器与Laravel 8在Google云中的应用

Php 503“;“服务不可用”;Docker容器与Laravel 8在Google云中的应用,php,laravel,docker,google-cloud-platform,google-cloud-run,Php,Laravel,Docker,Google Cloud Platform,Google Cloud Run,我正试图在谷歌云中运行Laravel8(带数据库!)。部署通过使用GitHub CI触发器的云运行完成 到目前为止我所做的: 我创建了所有必要的Docker文件,用于构建Docker映像和容器,如我的应用程序文档根目录中的Dockerfile和Docker-composer.yml。 因为我的应用程序需要一个后端和一个数据库,所以我创建了一个nginx.conf-file和一个int_db.sql文件来为数据库种子 Dockerfile FROM php:7.4-fpm # Arguments

我正试图在谷歌云中运行Laravel8(带数据库!)。部署通过使用GitHub CI触发器的云运行完成

到目前为止我所做的: 我创建了所有必要的Docker文件,用于构建Docker映像和容器,如我的应用程序文档根目录中的Dockerfile和Docker-composer.yml。 因为我的应用程序需要一个后端和一个数据库,所以我创建了一个nginx.conf-file和一个int_db.sql文件来为数据库种子

Dockerfile

FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user=hannes
ARG uid=1002

# Install system dependencies
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_mysql mbstring exif pcntl bcmath gd

# Get the latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
#RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN useradd -u 1002 -G www-data,root -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user
docker compose.yml

version: "3.7"
services:
  app:
    build:
      args:
        user: hannes
        uid: 1002
      context: ./
      dockerfile: Dockerfile
    image: feedbackapp
    ports: 
      - 8080
    environment:
      # /run/docs/reference/container-contract
      PORT: ${PORT:-8080}
      K_SERVICE: feedbackapp
      K_REVISION: 0
      K_CONFIGURATION: feedbackapp
    container_name: feedbackapp-container
    restart: unless-stopped
    working_dir: /var/www/
    volumes:
      - ./:/var/www
    networks:
      - feedbackapp

  db:
    image: mysql:5.7
    container_name: feedbackapp-db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: homestead
      MYSQL_ROOT_PASSWORD: homestead
      MYSQL_PASSWORD: secret
      MYSQL_USER: homestead
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker-compose/mysql:/docker-entrypoint-initdb.d
    networks:
      - feedbackapp

  nginx:
    image: nginx:alpine
    container_name: feedbackapp-nginx
    restart: unless-stopped
    ports:
      - 8000:80
    volumes:
      - ./:/var/www
      - ./docker-compose/nginx:/etc/nginx/conf.d/
    networks:
      - feedbackapp

networks:
  feedbackapp:
    driver: bridge
feedbackapp.conf

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    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;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}
在我的本地Docker环境中,如果我通过请求应用程序,Laravel 8应用程序将成功构建并运行良好http://localhost:8000/. 因此,我在Google Cloud中创建了一个云运行服务,并使用GitHub Repo的CI触发器。所以每次我推我的分支,我的云运行服务就会被触发并构建我的应用程序。 构建已在云构建中成功完成

问题:如果打开应用程序链接,我会收到503服务不可用错误

日志告诉我:


非常感谢您的帮助。注意安全。

有一个很大的混乱

云运行需要Dockerfile,并且应该在端口8080上公开正确的HTTP服务

所以docker compose不被Cloud Run使用

  • 确保在云运行时Dockerfile暴露端口8080
  • 确保容器中还有HTTP服务器和PHP可执行文件
  • 我首先看到的是Dockerfile没有Web服务器,也没有公开端口8080

    docker compose仅用于本地开发


    谢谢你的回答。我更新了Dockerfile,所以最后一行是:CMD php artisan serve--host=0.0.0.0--port=8080 EXPOSE 8080 Laravel本身正在工作,但Laravel无法连接到数据库。我得到错误“SQLSTATE[HY000][2002]连接被拒绝”。我猜是的,因为没有创建数据库,所以Laravel无法连接到数据库。my.env文件中的主机是“127.0.0.1”。我现在该怎么办?@hannes_rd Cloud Run没有本地数据库。因此,您需要使用公共IP创建一个Coud SQL数据库,然后使用Cloud Run设置“连接”,您需要使用unix套接字文件,而不是127.0.0.1。路径格式为
    /cloudsql/INSTANCE\u connection\u NAME
    阅读更多信息:谢谢。我使用以下PROD环境的.env参数修复了数据库连接问题:
    DB\u connection=mysql DB\u SOCKET=/cloudsql/PROJECT\u ID:ZONE:DB\u NAME