docker-compose – 运行两个服务来执行一个PHP脚本

我刚刚开始使用Docker,而且我对目前的结果非常满意。 我只是目前为了开发的目的而尝试。

我正在使用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 

一切正常。

但是我现在有一个问题,也许我完全不明白,但是我search了官方文档/ SO,没有find可以满足的答案。

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

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

和所有的作品。

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

事情是,脚本完全执行,我需要有我的mongodb容器启动和运行,因为脚本正在写入数据库。

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

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

但它会抛出错误,说它不能访问MongoDB。

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

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

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

更新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被正确closures。

所有这一切,恐怕我不知道links参数如何工作。 我的意思是,在官方文档中,我可以读到docker-compose.yaml版本1中使用docker-compose.yaml ,并且默认情况下所有服务都会自动链接到networking中。 也许这个行为只适用于调用docker-compose up ,而不是docker-compose run

links在这方面的行为在https://docs.docker.com/compose/compose-file/#links上的文档中有解释。 尤其是:

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

因此,运行docker-compose run会引发相关服务。 如果您不再需要运行依赖服务,您将需要明确地down相关服务。 它可能不会在rundowndown因为可能有多个运行或其他服务可能需要依赖该服务。

除此之外,还有一个更新的depends_on ,它在https://docs.docker.com/compose/compose-file/#depends_on中明确定义了依赖和顺序。 您不一定需要在稍后的Docker Compose版本中使用links ,因为服务名称已经作为DNS条目添加到/etc/hosts文件。