Как запустить Laravel Dusk для удаления веб-сайтов в контейнере Docker - PullRequest
0 голосов
/ 28 июня 2019

Я использую Dusk 5.1.

Моя цель - использовать Dusk для очистки внешних сайтов в процессе производства.Ничего лишнего, только несколько RSS-каналов и, возможно, темы на форуме.Мое приложение работает в моем собственном стеке docker-compose (не в Laradock или чем-либо еще) в production.

Я не регистрирую DuskServiceProvider и, следовательно, не подвержен риску в production.

Вот проблема:

Facebook\WebDriver\Exception\WebDriverCurlException  : Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"w3c":false,"binary":"","args":["--disable-gpu","--headless","--no-sandbox","--verbose"]}}}

Failed to connect to localhost port 9515: Connection refused

Вот Browser.php, который я использую, вместо того, который поставляется с Dusk для тестирования:

/**
 * Reporting browser for console commands
 */
class Browser
{
    /**
     * @var \Laravel\Dusk\Browser
     */
    private $browser;

    public function browse(Closure $callback)
    {
        if (!$this->browser) {
            $this->browser = $this->newBrowser($this->createWebDriver());
        }
        try {
            $callback($this->browser);
        } catch (Exception $e) {
            throw $e;
        } catch (Throwable $e) {
            throw $e;
        }
    }

    function __destruct()
    {
        if ($this->browser) {
            $this->closeBrowser();
        }
    }

    protected function closeBrowser()
    {
        if (!$this->browser) {
            throw new Exception("The browser hasn't been initialized yet");
        }

        $this->browser->quit();
        $this->browser = null;
    }

    protected function newBrowser($driver)
    {
        return new DuskBrowser($driver);
    }

    /**
     * Create the remote web driver instance.
     *
     * @return \Facebook\WebDriver\Remote\RemoteWebDriver
     */
    protected function createWebDriver()
    {
        return retry(5, function () {
            return $this->driver();
        }, 50);
    }

    protected function driver()
    {
        $options = new ChromeOptions();
        $options->addArguments([
            '--disable-gpu',
            '--headless',
            '--no-sandbox',
            '--verbose',
        ]);
        $capabilities = DesiredCapabilities::chrome();
        $capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
        return RemoteWebDriver::create(
            'http://localhost:9515', $capabilities
        );
    }
}

Затем в своем приложении я использую:

$defaultBrowser = app(Browser::class);
$defaultBrowser->browse(function (\Laravel\Dusk\Browser $browser) use ($feed) {
    $pageSoure = $browser->visit($this->feedUrl())
        ->driver->getPageSource();

    preg_match('/(<rss.+?<\/rss>)/is', $pageSoure, $matches);

    $feed->fromContents($matches[0]);
});

В чем я не уверен, так это в том, какие шаги мне нужно предпринять, чтобы получить корректный запуск драйвера chrome в моем контейнере.

Примечание: в Интернете есть руководства по использованию Laravel Dusk с Docker, основанные на Selenium.Это приводит к проблемам с параллелизмом в моем приложении, поскольку они требуют запуска Selenium в качестве автономной службы, что приводит к проблемам сеанса, когда несколько заданий используют его одновременно.

My docker-compose Я не уверен, почему это было бы актуально, но некоторые люди просили об этом.

version: '3'

services:
  web:
    build:
      context: .
      dockerfile: infrastructure/web/Dockerfile
    image: registry.gitlab.com/namespace/project:web
    env_file: .env
    volumes:
      - ./:/var/www/html
      - ./infrastructure/web:/etc/nginx/conf.d
    links:
      - redis
      - db
    ports:
      - "80:80"
  frontend-dev:
    image: registry.gitlab.com/namespace/project:web
    depends_on:
      - web
    volumes:
      - ./:/var/www/html
    command: sh -c "yarn install && yarn run dev"
  queue:
    build:
      context: .
      dockerfile: infrastructure/cli/Dockerfile
    image: registry.gitlab.com/namespace/project:cli
    env_file: .env
    volumes:
      - ./:/var/www/html
    command: php /var/www/html/artisan horizon
    links:
      - redis
      - db
  redis:
    image: redis:5.0-alpine
  ngrok:
    image: wernight/ngrok
    env_file: .env
    depends_on:
      - web
    ports:
      - "4040:4040"
  db:
    image: mysql:8.0.3
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxx
      MYSQL_DATABASE: xxxxxx
      MYSQL_USER: xxxxxx
      MYSQL_PASSWORD: xxxxxx
...