如何撰写docker-compose.yml,以便我可以从php访问Deamon的容器?

时间:2018-11-02 02:40:33

标签: docker casperjs

我需要Docker方面的帮助。

可以说我拥有Nginx + PHP的docker-compose.yml版本3。如何添加图片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 :(得分:1)

  

问:如何编写docker-compose.yml,以便我可以从php访问Deamon的容器?

A:您可以共享Docker的unix domain socket来访问守护程序的容器。

类似如下:

docker-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,在PHP代码中仍然使用exec并获取输出。

更新时间:(2018/11/05)

首先,我认为一些概念需要与您保持一致:

  • -d:这表示start a container in detached mode,而不是daemon。在docker中,当我们谈论守护程序时,它意味着docker daemon曾经接受docker cli的连接,请参见here

  • --rm:这只是在使用后删除临时容器,您也可以不使用它。

使用-dno -d的区别:

  • With -d:它将以分离模式运行容器,这意味着即使容器正在运行,cli命令docker run也将立即退出并显示一个容器ID,没有任何日志您将看到,像下一个一样:

    # 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

docker-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打印的,注意privilegedvolumes是必须设置的。