Dockerized Laravel应用程序,资产总是404

时间:2018-05-31 13:28:10

标签: php laravel docker nginx

所以,经过大量尝试后,我设法让我的Laravel 5.6应用程序通过docker运行。我正在创建图像并将其存储在Amazon ECR上。然后通过docker-compose我正在加载Laravel,Nginx和其他一些。

除了一件事,一切都很完美。与css和js等资产相关的所有内容都未加载(404)。

我尝试在前面加载'/',我尝试通过assets()函数,但无济于事。

所以,这是我用过的文件:

Laravel app的Dockerfile:

FROM php:7.1.15-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client zip unzip git libjpeg62-turbo-dev libpng12-dev libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install gd mcrypt pdo_mysql \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY php-fpm.conf /etc/php-fpm.conf

COPY www.conf /etc/php-fpm.d/www.conf

WORKDIR /var/www

COPY . /var/www

RUN composer update

RUN chown -R www-data: /var/www

此图片构建良好并存储在亚马逊中。

docker-compose文件:

version: '2'
services:

  # The Laravel Application
  app:
    image: URL_TO_IMAGE-WORKS
    restart: always
    working_dir: /var/www
    volumes:
      - ./storage/app:/var/www/storage/app
      - ./storage/logs:/var/www/storage/logs
      - "./php-fpm.conf:/etc/php-fpm.conf"
      - "./www.conf:/etc/php-fpm.d/www.conf"
    links:
    - database
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"

#The Nginx server
  proxy:
    build: server
    working_dir: /var/www
    restart: always
    volumes_from:
      - app
    ports:
      - "80:80"

  database:
    image: mysql:5.7.22
    volumes:
      - ./mysqldata_2:/var/lib/mysql
    restart: always
    environment:
      - "MYSQL_ROOT_PASSWORD=secret"
      - "MYSQL_DATABASE=secret"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_USER=secret"
    ports:
        - "33061:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - database
    ports:
      - '8080:80'
    restart: always
    environment:
      PMA_HOST: database
      PMA_PORT: 3306

  elk:
    image: sebp/elk
    ports:
      - "5601:5601"
      - "9200:9200"
      - "5044:5044"

NGINX Docker文件是:

FROM nginx:alpine
RUN rm /etc/nginx/conf.d/*
COPY proxy.conf /etc/nginx/conf.d

NGINX使用的proxy.conf:

server {
    listen 80;
    server_name  admin.mydomain.com;
    include /etc/nginx/mime.types;
    index index.php server.php;
           root /var/www/public;

           location / {
               try_files $uri $uri/ /index.php?$args;
           }

           location ~ \.php$ {
               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;
           }

   }

所以,在一切顺利启动之后,我明智地导航到admin.mydomain.com功能,但是css和js文件都没有加载。

我尝试了很多不同的设置,在docker镜像和nginx设置上都无济于事。任何见解都将受到高度赞赏!

注意:如果您需要任何额外的信息,请告诉我

2 个答案:

答案 0 :(得分:0)

我遇到了这个问题。

  • 我在本地链接了存储(php artisan storage:link),并确保可以在容器中通过ls找到文件。
  • 我确保我的vhost.conf(使用apache)遵循符号链接。

  • 我检查了dockerfile末尾是否启用了mod_rewrite(a2enmod rewrite)。

答案 1 :(得分:0)

Nginx(代理docker)无需使用php脚本(应用docker)即可直接提供静态内容。 docker-compose文件必须为代理服务定义volume参数:

 proxy:
     build: server
     working_dir: /var/www
     restart: always
     # Here the volume defined
     volumes:
       - ./:/var/www
     ports:
       - "80:80"

无需DB即可完成工作:

docker-compose.yml:

version: '3.4'
services:
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www:cached
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www
    ports:
      - 81:81

app.dockerfile:

FROM php:7.1.3-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install mcrypt pdo_mysql

web.dockerfile:

FROM nginx:1.10
ADD vhost.conf /etc/nginx/conf.d/default.conf

vhost.conf:

server {

    listen 81;
    index index.php server.php index.html;
    root /var/www/public;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        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;
    }
}