在 Docker 容器中使用 MPDF 的 Laravel 找不到我的图像 url(由于 docker)

问题描述 投票:0回答:1

问题:创建 PDF 时放入的任何 URL,MPDF 都无法找到它(引发异常)。

Exception: cURL error: \"Failed to connect to 127.0.0.1 port 8000: Connection refused\"

我在这个应用程序中同时拥有 Web 和 api,奇怪的是我的 Web 应用程序 HTML 可以找到这些图像。我按照教程创建了一个非常基本的环境。

我使用

http://127.0.0.1:8000/
作为基本 URL 来访问我的应用程序和 api。

  • 图片位于
    ROOT_DIR/public/uploads/report_templates/logo/logo-white.png
  • 网络可以通过
    http://127.0.0.1:8000/uploads/report_templates/logo/logo-white.png
    看到这一点。

我发现的东西

  • 任何外部网址如
    https://www.google.pl/images/srpr/logo11w.png
    都可以找到。
  • 如果我放置绝对路径而不是 url,则会找到它(不能诉诸如此艰难,因为这是一份冗长的报告。)
  • 使用容器内部的
    curl
    表示
    http://127.0.0.1:8000/uploads/report_templates/logo/logo-white.png
    
    
  • 我明白,我在第三点请求到我自己的容器中做错了。但在网络上找不到任何具体的东西,而且对于 docker 来说太新了,无法想到我自己的东西。

我正在寻找一种在docker中处理这个问题的正确方法。

.env

Failed to connect to 127.0.0.1 port 8000: Connection refused

docker-compose.yml

... APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://127.0.0.1:8000/ ...

Dockerfile

version: "3.7" services: app: build: args: user: daniyalnasir uid: 1001 context: ./ dockerfile: Dockerfile image: f-scope container_name: f-scope-app restart: unless-stopped working_dir: /var/www/ volumes: - ./:/var/www networks: f-scope: db: image: mysql:5.7 container_name: f-scope-db restart: unless-stopped environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD} # MYSQL_USER: ${DB_USERNAME} # MYSQL_ALLOW_EMPTY_PASSWORD: 1 SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata1:/var/lib/mysql - ./docker-compose/mysql:/docker-entrypoint-initdb.d networks: f-scope: ipv4_address: 172.24.2.1 nginx: image: nginx:alpine container_name: f-scope-nginx restart: unless-stopped ports: - 8000:80 volumes: - ./:/var/www - ./public/uploads:/var/www/public/uploads - ./docker-compose/nginx:/etc/nginx/conf.d/ networks: f-scope: networks: f-scope: driver: bridge ipam: driver: default config: - subnet: "172.24.2.0/16" volumes: dbdata1:

HTML

FROM php:7.4-fpm # Arguments defined in docker-compose.yml ARG user ARG uid # Install system dependencies RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ libgd-dev \ libzip-dev \ zip \ sendmail \ unzip # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install PHP extensions RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # Configure sendmail path RUN echo "sendmail_path=/usr/sbin/sendmail -t -i" >> /usr/local/etc/php/conf.d/sendmail.ini #RUN sed -i '/#!\/bin\/sh/aservice sendmail restart' /usr/local/bin/docker-php-entrypoint #RUN sed -i '/#!\/bin\/sh/aecho "$(hostname -i)\t$(hostname) $(hostname).localhost" >> /etc/hosts' /usr/local/bin/docker-php-entrypoint # Get 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 mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Set working directory WORKDIR /var/www USER $user

上下文

我正在使用

MPDF

创建一个包含图像 url 的 pdf(指向我的应用程序的公共文件夹)。它在我的常规 LAMP 环境中运行良好。 但是,学习

(以及出于其他一些原因)

。我决定在本地计算机上的 docker 容器中创建并运行这个应用程序(运行 ubuntu)。除了这一件事之外,在这个 docker 环境中一切都正常工作。

php docker ubuntu laravel-5 docker-compose
1个回答
0
投票
<img src="{{url("uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />

localhost
指的是容器本身,而不是运行服务器的主机。这就是为什么您的应用程序无法通过
127.0.0.1
访问图像。
一种解决方案是使用 

http://127.0.0.1:8000/

主机名,它会自动解析为主机使用的内部 IP 地址。这是 Docker 容器可以用来访问主机的 IP 地址。

因此,您可以更改图像 URL:

host.docker.internal

至:

<img src="{{url("uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />

这样,Docker 容器内的应用程序将能够访问主机上运行的服务器提供的映像。

请注意,

<img src="{{url("http://host.docker.internal:8000/uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />

目前仅适用于 Windows 和 Mac。如果您在 Linux 上使用 Docker,则可能需要使用主机的实际 IP 地址,而不是

host.docker.internal
    

© www.soinside.com 2019 - 2024. All rights reserved.