2017-07-30 252 views
0

我刚刚开始使用Docker,前几天我对结果非常满意。我目前只是为了开发目的而尝试它。docker-compose - 运行两个服务来执行一个PHP脚本

我使用docker-compose,这是我docker-compose.yaml

version: '2' 

services: 
    nginx: 
     image: nginx:alpine 
     ports: 
      - "8070:80" 
     volumes: 
      - ./:/app 
      - ./docker-nginx-default.conf:/etc/nginx/conf.d/default.conf 

    php7: 
     container_name: php7 
     image: adrian1210/php 
     volumes: 
      - ./:/app:delegated 
     environment: 
      XDEBUG_CONFIG: "remote_host=192.168.5.14" 

    composer: 
     entrypoint: /bin/true 
     image: composer 
     volumes: 
      - ./:/app 
     command: install --ignore-platform-reqs --no-scripts 

    mongodb: 
     image: mongo 
     environment: 
      - MONGO_DATA_DIR=/data/db 
      - MONGO_LOG_DIR=/dev/null 
     volumes: 
      - ./data/db:/data/db 
     ports: 
      - 8080:27017 
     command: mongod --smallfiles --logpath=/dev/null # --quiet 

一切工作好了。

但是我现在有一个问题,也许我完全不理解这个,但是我搜索了官方文档/ SO并没有找到可以满足的答案。

我有一个PHP脚本,我只想从我的主机操作系统运行。类似于使用composer安装PHP依赖项。当安装PHP的依赖关系,我只想跑

docker run --rm --interactive --tty --volume $PWD:/app composer install --ignore-platform-reqs --no-scripts

和所有的作品。

现在我有一个PHP脚本,我需要以相同的方式执行,意思是'执行并关闭所有内容'。

问题是,为了脚本完全执行,我需要启动并运行我的mongodb容器,因为脚本正在写入数据库。

所以,因为我必须MongoDB的容器,我试图用docker-compose执行脚本,而不是用docker

docker-compose run php7 php /app/Apps/Php/Cli/install.php

但它抛出的错误,认为它不能访问MongoDB的。

这是真的,如果我输入docker ps,容器不在那里。

但是,如果我例如。用docker-compose up -d运行整个环境并输入docker ps后,我会看到mongodb正在运行,当然,如果我再次运行上面的install.php脚本,它将起作用。

所以我的问题是,我可以以某种方式一起运行php7 + mongodb服务,并在脚本完成后立即关闭它们?

更新1:DID工作调整docker-compose.yaml

一方面,PHP7服务,现在它看起来像这样:

php7: 
    container_name: php7 
    image: adrian1210/php 
    volumes: 
     - ./:/app:delegated 
    environment: 
     XDEBUG_CONFIG: "remote_host=192.168.5.14" 
    links: 
     - mongodb 

因此,大家可以看到,我添加links节它的工作。当使用此参数运行脚本时(我使用了相同的docker-compose run ...命令),我可以在控制台中看到mongodb正在启动。

现在,唯一没有奏效的是脚本完成后,mongodb仍在运行。 php7被正确关闭。

所有这些,恐怕我不知道links参数是如何工作的。我的意思是,在官方的文档,我可以读到links是的东西,是在docker-compose.yaml 1版本中使用,所有服务将自动链接到默认的网络。也许调用docker-compose up,不docker-compose run当这种行为仅适​​用?

回答

1

在这方面的links的行为的文档在https://docs.docker.com/compose/compose-file/#links解释。特别是:

链接也以与depends_on相同的方式表示服务之间的依赖关系,因此它们确定服务启动的顺序。

所以,运行docker-compose run带来了up的依赖服务。如果不再需要运行依赖服务,则需要明确down。它可能不会把它down一个run后因为有可能是多次运行或其他服务,可能需要依赖于服务也是如此。

除此之外,还有一个更新的depends_on明确定义在https://docs.docker.com/compose/compose-file/#depends_on的依赖关系和顺序。你不一定需要使用links在以后的码头工人撰写的版本作为服务名称已经被添加作为一个DNS条目的/etc/hosts文件。

+0

我只是想谢谢大家的回答。如果有任何其他解决方案,将搜索一下。 – Adrian

相关问题