Laravel在Docker容器中使用MPDF无法找到我的镜像URL(由于Docker)

xv8emn3q  于 11个月前  发布在  Docker
关注(0)|答案(1)|浏览(83)

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

第一个月
我在这个应用程序中有Web和API,奇怪的是,我的Web应用程序HTML可以找到这些图像。
我使用http://127.0.0.1:8000/作为基本URL来访问我的应用程序和API。

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

Things I Found

  • 可以找到任何外部URL,如https://www.google.pl/images/srpr/logo11w.png
  • 如果我把绝对路径,而不是URL,它被发现(不能诉诸这一坚韧,因为这是一个冗长的报告。)
  • http://127.0.0.1:8000/uploads/report_templates/logo/logo-white.png的容器中使用curl表示为Failed to connect to 127.0.0.1 port 8000: Connection refused

我明白,我在第三点请求进入我自己的容器中做错了。但是在web中找不到任何特定的东西,对docker来说太新了,无法想到我自己的东西。
我正在寻找一个正确的方法来处理这个在码头。

.env

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

字符串

docker-compose.yml

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:

Dockerfile

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

HTML

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

用于上下文

我正在使用MPDF创建一个带有图片URL的PDF(* 指向我的应用程序的公共文件夹 *)。它在我的常规LAMP环境中工作正常。
但是,为了学习,我决定在我的本地机器 (运行ubuntu) 上的docker容器中创建和运行这个应用程序。一切都在这个docker环境中正常工作,除了这一件事。

bhmjp9jg

bhmjp9jg1#

在开发环境中使用Docker时,适当配置用于相对src和href属性的basepath以确保可访问性至关重要。在您提供的上下文中,Mpdf试图通过http://yourapp.test:8000/uploads/report_templates/logo/logo-white.png访问镜像,但nginx容器无法解析主机(yourapp.test)并在端口8000上建立连接。
因此,basepath应该配置为“localhost”、“127.0.0.1“或容器的本地IP地址。

$mpdf = new Mpdf();
$mpdf->SetBasePath('http://localhost');

字符串
如果nginx容器在80以外的端口上运行,则需要指定端口:

// For instance, if the nginx container runs on port 8080.
$mpdf->SetBasePath('http://localhost:8080');


但是,需要注意的是,理想情况下,在生产环境中不需要这种配置,因为basepath应该得到适当的配置和访问。

相关问题