Laravel 码头集装箱被称为拉雷维尔

Laravel 码头集装箱被称为拉雷维尔,laravel,docker,docker-compose,Laravel,Docker,Docker Compose,如何称呼Laravel中的docker容器?我正在使用以下软件包下载PDF,我有一个npm容器,我正在尝试与此软件包一起使用 我的站点容器没有安装节点或npm,这就是为什么我需要使用我的npm容器 这是我的docker文件 version: '3' networks: laravel: services: site: build: context: . dockerfile: docker/nginx/Dockerfile container_

如何称呼Laravel中的docker容器?我正在使用以下软件包下载PDF,我有一个npm容器,我正在尝试与此软件包一起使用

我的站点容器没有安装节点或npm,这就是为什么我需要使用我的npm容器

这是我的docker文件

version: '3'

networks:
  laravel:

services:
  site:
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html:delegated
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mysql:5.7.29
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: odc
      MYSQL_USER: admin
      MYSQL_PASSWORD: ".d3aP/7N,c)&^EdC"
      MYSQL_ROOT_PASSWORD: "%3h_Ssxm7sSj#bw!"
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    container_name: php
    volumes:
      - ./src:/var/www/html:delegated
    networks:
      - laravel

  composer:
    build:
      context: .
      dockerfile: docker/composer/Dockerfile
    container_name: composer
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php
    user: laravel
    entrypoint: ['composer', '--ignore-platform-reqs']
    networks:
      - laravel

  npm:
    image: node:13.7
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']
    networks:
      - laravel

  chrome:
    image: zenika/alpine-chrome:latest
    container_name: headless-chrome
    networks:
      - laravel
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
下面是我试图使用Browsershot指向我的npm容器的代码

Browsershot::html($html)
    ->setIncludePath('npm')
    ->setNodeModulePath("npm")
    ->setChromePath('chrome')
    ->noSandbox()
    ->showBackground()
    ->format('A4')
    ->savePdf($path . '/portrait.pdf');
如您所见,我正在使用
->setIncludePath('npm')
尝试调用我的npm容器,但在尝试运行此代码时仍收到此错误


sh:npm:notfound sh:node:notfound

您不需要单独的节点/npm容器。浏览器快照是应用程序核心的一部分。要使其工作,您需要nodejs和npm。也就是说,我将构建自己的包含PHP和节点的容器映像。这使得Browershot的实现更加简单

如果需要的话,你可以稍后把它们分开。但在这种情况下,我将创建一个新的BrowserShot服务(PHP+节点)

正如你所看到的,有多种方法可以做到这一点

在应用程序容器库中使用NGINX单元怎么样?您可以使用单元PHP基本映像并在其上添加节点

我在这里做到了:


注意!这是一个演示目的。您可以根据您的生产需要进行调整

你在混合东西。。。因此,默认情况下,php laravel容器无法访问节点容器的文件系统。所以说在你的laravell容器中根本不会安装npm。。。如果您想使用php容器中另一个容器中的npm容器,您必须装载它。但我不想这样做。。。为什么不直接在php容器中安装node/npm?@TimoStark您可能知道我对docker很陌生,我只是不确定最佳做法。如果我在php容器上安装了npm/node,我应该删除npm容器吗?@TimoStark为什么不建议为npm/NodeJ创建自己的容器?在我看来,它使整个CI/CD过程变得更好。如果你在Laravel容器中有npm/nodejs/chrome,我想你的图像会比需要的更大。我想,由于代码发生了更改,您必须更频繁地部署Laravel容器,因此分离节点内容(因为更改不太频繁)以保持Laravel映像较小是有意义的。这不会减少k8s管道和部署、复制映像等的时间吗?我一般不反对运行第二个容器实例来处理节点部分。但在这种特殊情况下,我们并不是说有两个容器,节点容器包含自己的服务,可以从laravel“调用”。如果NodeJS容器是一个服务,我们可以通过网络发送一个HTML负载,它会用PDF响应,我完全同意!但是共享两个容器的文件系统(无论是否使用k8s)并不是一个理想的解决方案。在我看来,NodeJS应用程序是用Laravel编写的服务的一部分。所以它应该是ContaiBut的一部分:在这个场景中,PDF服务将是一个“真正的”服务,而不仅仅是一个包含npm二进制文件的容器,我完全同意你的看法!将其放在单独的服务/容器中是个好主意。也许有一天重构这个实现并用它制作一个真正的PDF呈现服务是值得的。我做了好几次,没有任何问题。谢谢你的回答!我已经在我的php容器上安装了npm,它可以工作了,这是否意味着我应该删除我的外部npm容器?是的。只需将其从docker compose文件中删除即可。太好了,它对你有用。对于以后的项目。第一:Thnik simple和start simple。复杂性迟早会自行到来:D快乐黑客!谢谢,这也适用于我的chrome容器吗?我想创建一个单独的容器来承载headless chrome,并在我的laravel项目中访问它
->setChromePath(“chrome”)
我一直收到一个错误,说找不到它。同样的事情。将其包含在主php项目中。从安全的角度来看,不要将PHP应用程序的webroot用于每个二进制文件。但你可以放心地包括。如前所述,您可能希望稍后创建一个单独的Browsershot服务,并在PHP中使用cURL来调用它。例如
FROM nginx/unit:1.22.0-php7.3
RUN mkdir /var/apphome/ && groupadd -r appuser && useradd --no-log-init -r -g appuser appuser && \
    chown -R appuser:appuser /var/apphome/ && \
    apt-get update && apt-get install --no-install-recommends --no-install-suggests -y gnupg && \
    curl -sL https://nginx.org/keys/nginx_signing.key | apt-key add - && \
    echo "deb https://packages.nginx.org/unit/debian/ buster unit" >> /etc/apt/sources.list.d/unit.list && \
    echo "deb-src https://packages.nginx.org/unit/debian/ buster unit" >> /etc/apt/sources.list.d/unit.list && \
    apt update && apt install -y unit-dev npm php7.3-mysql php7.3-gd && \
    npm install -g --unsafe-perm unit-http -y

COPY src/ /var/apphome/app/
RUN chown -R appuser:appuser /var/apphome/
COPY .unit.conf.json /docker-entrypoint.d/.unit.conf.json
CMD ["unitd", "--no-daemon", "--control", "unix:/var/run/control.unit.sock"]