Как составить docker-compose.yml, чтобы я мог получить доступ к контейнеру Деймона из php? - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужна помощь с докером.

Допустим, у меня есть docker-compose.yml версия 3 с Nginx + PHP. Как добавить изображение vitr / casperjs , чтобы я мог вызывать его из PHP как

exec('casperjs --version', $output);

?

Любая помощь приветствуется.

ОБНОВЛЕНО

Похоже, правильный ответ будет: Это невозможно .

Вам нужно поместить PHP и CasperJS (и PhantoJS также) в один и тот же контейнер, чтобы они работали вместе. Было бы хорошо, если бы кто-то мог доказать, что я неправ, и показать лучше, где это сделать. Вот что-то вроде рабочего примера:

FROM nanoninja/php-fpm

ENV PHANTOMJS_VERSION=phantomjs-2.1.1-linux-x86_64 
ENV PHANTOMJS_DIR=/app/phantomjs

RUN apt-get update -y
RUN apt-get install -y apt-utils libfreetype6-dev libfontconfig1-dev wget bzip2

RUN wget --no-check-certificate https://bitbucket.org/ariya/phantomjs/downloads/${PHANTOMJS_VERSION}.tar.bz2
RUN tar xvf ${PHANTOMJS_VERSION}.tar.bz2
RUN mv ${PHANTOMJS_VERSION}/bin/phantomjs /usr/local/bin/
RUN rm -rf phantom*

RUN mkdir -p ${PHANTOMJS_DIR}
RUN echo '"use strict"; \n\
  console.log("Hello, world!"); + \n\
  console.log("using PhantomJS version " + \n\
  phantom.version.major + "." + \n\
  phantom.version.minor + "." + \n\
  phantom.version.patch); \n\
  phantom.exit();' \
  > ${PHANTOMJS_DIR}/script.js

RUN  apt-get update -y && apt-get install -y \
      git \
      python \
     && rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/n1k0/casperjs.git
RUN mv casperjs /opt/
RUN ln -sf /opt/casperjs/bin/casperjs /usr/local/bin/casperjs

1 Ответ

0 голосов
/ 02 ноября 2018

В: Как создать docker-compose.yml, чтобы я мог получить доступ к контейнеру Деймона из php?

A: Вы можете поделиться докером unix domain socket для доступа к контейнеру демона.

Примерно так:

докер-compose.yml:

version: '3'
services:
  app:
    image: ubuntu:16.04
    privileged: true
    volumes:
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
    command: docker run --rm vitr/casperjs casperjs --version

Тест:

# docker-compose up
WARNING: Found orphan containers (abc_plop_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating abc_app_1 ... done
Attaching to abc_app_1
app_1  | 1.1.4
abc_app_1 exited with code 0

Вы видите, что 1.1.4 был напечатан командой выполнения docker run --rm vitr/casperjs casperjs --version в app container.

Это всего лишь пример, вы можете вызвать docker run --rm vitr/casperjs casperjs --version по своему php container, не использовать ubuntu:16.04, по-прежнему использовать exec в коде php и получить вывод.

Обновлено: (2018/11/05)

Сначала я думаю, что некоторые концепции должны быть согласованы с вами:

  • -d: это означает start a container in detached mode, а не daemon. В докере, когда мы говорим о демоне, это означает docker daemon, который принимал соединение docker cli, см. здесь .

  • --rm: это просто для удаления временного контейнера после его использования, вы также не можете его использовать.

Разница в использовании -d & no -d:

  • With -d: он будет запускать контейнер в отдельном режиме, это означает, что даже запущенный контейнер, команда cli docker run, сразу выйдет и покажет вам идентификатор контейнера, никакого журнала вы не увидите, как следующий:

    # docker run -d vitr/casperjs casperjs --version d8dc585bc9e3cc577cab15ff665b98d798d95bc369c876d6da31210f625b81e0

  • Without -d: команда cli не завершится до тех пор, пока не завершится команда окончания контейнера, поэтому вы можете увидеть вывод команды, например:

    # docker run vitr/casperjs casperjs --version 1.1.4

Итак, ваше требование состоит в том, чтобы получить вывод casperjs, наверняка вам приходилось использовать режим no -d, я думаю.

Если вы принимаете вышеизложенные понятия, вы можете перейти к работоспособному примеру:

структура папок:

abc
├── docker-compose.yml
└── index.php

докер-compose.yml:

version: '3'
services:
  phpfpm:
    container_name: phpfpm
    image: nanoninja/php-fpm
    entrypoint: php index.php
    privileged: true
    volumes:
      - .:/var/www/html
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7

index.php:

<?php
exec('docker run vitr/casperjs casperjs --version', $output);
print_r($output);

тест:

~/abc# docker-compose up
Starting phpfpm ... done
Attaching to phpfpm
phpfpm    | Array
phpfpm    | (
phpfpm    |     [0] => 1.1.4
phpfpm    | )
phpfpm exited with code 0

Вы можете видеть, что 1.1.4 был напечатан через php, внимание privileged & volumes - это то, что нужно было установить.

...