我需要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
答案 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
:这只是在使用后删除临时容器,您也可以不使用它。
使用-d
和no -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打印的,注意privileged
和volumes
是必须设置的。