首页 > 解决方案 > php artisan storage:使用 Laravel 和 Docker 时的链接问题

问题描述

当人们设置 Docker 容器以使用该容器为 Laravel 应用程序提供服务时,这似乎是一个常见问题。

我的设置主要是这样(我删除了一些其他服务,因为我认为它们不适用于这里)

#docker-compose up --build
version: "2"
services:
  nginx:
    image: nginx
    depends_on: [pacs-1,mysql_db]
    restart: unless-stopped
    ports: ["443:443"]
    volumes:
       - ./nginx-home:/nginx-home
       - ./tls:/etc/nginx/tls
       - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
       
  php-fpm:
    build: php-fpm
    volumes:
       - ./nginx-home:/nginx-home

Laravel 项目的 nginx 的 default.conf 是:

server {

# implement the TLS
     listen 443 ssl;
     server_name dockerlaravel.medical.ky;
     root /nginx-home/PortalRads/public;
     access_log /nginx-home/logs/PortalRads-access.log;
     error_log  /nginx-home/logs/PortalRads-error.log info;
     index index.php index.html index.htm;

     client_max_body_size 4000M;
     client_body_buffer_size  4000M;

     # skip favicon.ico
     #
     #location = /favicon.ico {
     #access_log off;
     return 444;
     #
     }
     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 php-fpm:9000;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;

         error_page  404  /error_pages/404.php;
    
         error_page  403  /error_pages/403.php;

         error_page  401  /error_pages/401.php;

         error_page  500 502 503 504 /errors/50x.html;
    
     }

 }

一旦我完成所有设置,一切似乎都可以正常工作。Composer 全局安装在主机上,我在主机端使用 composer update 来更新包。似乎没有必要使用我的设置在 Docker 上安装 composer,因为 php 容器具有 php 并且 artisan 二进制文件位于我的 Laravel 应用程序的根目录中。

我遇到的问题是从公共/存储到存储文件夹的符号链接似乎不起作用。我尝试了各种方法来创建链接。我实际上有单独的 nginx 和 php 容器,所以 artisan 不会在 nginx 容器中运行。

由于我使用 nginx 作为网络服务器,想知道是否可能有另一个位置块或服务器块基本上会在服务器端创建该连接,这样我就不必摆弄工匠创建的符号链接?

location /storage/ {

    root . . .
    . . . 
}

我可以使用以下命令从 CLI 进入这些容器:

sudo docker exec -it orthanc-docker-dev_ris_php-fpm_1 /bin/bash sudo docker exec -it orthanc-docker-dev_ris_nginx_1 /bin/bash

我已经尝试从容器内创建符号链接,但这似乎也不起作用。

例如,我在 Laravel 中使用 JetStream 和 Livewire,那里的个人资料照片映射到:

https://dockerlaravel.medical.ky/storage/profile-photos/image.png

但这会产生 404 错误,因为符号链接不能正确设置。

关于这个问题有很多帖子。只是想知道“最佳”解决方案是什么,最好是在容器构建期间可以自动化的解决方案,这样用户就不必担心这一点。

谢谢。

标签: phplaraveldockernginx

解决方案


推荐阅读