Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何从一个地方访问不同Docker容器中的脚本? 设置:_Laravel_Docker_Docker Compose - Fatal编程技术网

Laravel 如何从一个地方访问不同Docker容器中的脚本? 设置:

Laravel 如何从一个地方访问不同Docker容器中的脚本? 设置:,laravel,docker,docker-compose,Laravel,Docker,Docker Compose,我使用docker compose创建一组类似于环境的容器,当然要根据我的需要进行调整。因此,我有以下容器: nginx php_fpm php_队列 应用程序[数据容器] mysql 套接字[运行websocket服务器的nodejs容器] 雷迪斯 [我将在下面发布docker-compose.yml] 问题: 正如您所看到的,这里有很多容器可以相互通信,有时我需要在其中运行命令。例如,有时我需要在php\u队列容器中运行php artisan…命令,或者在nodejs容器中运行gulp

我使用docker compose创建一组类似于环境的容器,当然要根据我的需要进行调整。因此,我有以下容器:

  • nginx
  • php_fpm
  • php_队列
  • 应用程序[数据容器]
  • mysql
  • 套接字[运行websocket服务器的nodejs容器]
  • 雷迪斯
[我将在下面发布docker-compose.yml]

问题: 正如您所看到的,这里有很多容器可以相互通信,有时我需要在其中运行命令。例如,有时我需要在
php\u队列
容器中运行
php artisan…
命令,或者在nodejs容器中运行
gulp

所以我现在要做的是
docker exec
进入每个容器,然后运行必要的命令。但这很烦人,因为我必须经常在PHP和JS容器之间切换,很容易混淆它们

问题: 是否可以从一个位置(无论是主机还是另一个容器)访问必要的脚本(
gulp
php-artisan
npm
composer
)呢

可能的解决办法: 我想添加另一个将安装所有引擎的容器(PHP和nodejs),这样我就可以在该容器中使用SSH或
docker exec
,并运行任何必要的操作。如果这是唯一可能的解决方案,听起来也不错,但我想探讨一下选项


文件夹: docker compose.yml

version: '2'

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
            - 443:443
        depends_on:
            - php_fpm
            - sockets
        links:
            - php_fpm
            - sockets
        volumes_from:
            - app

    php_fpm:
        build:
            context: ./php/
        expose:
            - 9000
        links:
            - mysql
            - redis
        volumes_from:
            - app

    php_queue:
        build:
            context: ./php/
        links:
            - mysql
            - redis
        volumes_from:
            - app
        command: "php /var/www/koodzo/artisan queue:work --daemon"

    app:
        image: php:7.0-fpm
        volumes:
            - ../Sources:/var/www/koodzo
        command: "true"

    mysql:
        image: mysql:5.7
        ports:
            - 3306:3306
        volumes:
            - ../Database:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: secret
            MYSQL_DATABASE: koodzo
            MYSQL_USER: homestead
            MYSQL_PASSWORD: secret

    sockets:
        build: ./sockets
        expose:
            - 6001
        volumes_from:
            - app
        command: "node /var/www/koodzo/sockets/server.js"

    redis:
        image: redis:3.2
        expose:
            - 6379

您知道可以使用exec来实际运行命令吗?这样,您就可以在docker-compose.yml中命名不同的容器,然后运行一个脚本,使用docker exec按容器名称执行所有命令。

这也是一种很好的方法,比使用主容器更好。但我的问题更多的是关于docker简化任务的内置方法。无论如何,谢谢:)请注意,您想要做的实际上与docker哲学有点矛盾。docker实现目标的方法是在每次图像更改时(比如gulpfile或package.json更改时)重建图像。在正在运行的容器上执行命令可以进行实验,但在尝试开发容器进程时,这不是一个好的实践。因此,docker的方法是每次运行重建映像,运行您希望在dockerfileI中执行的命令,我理解您的意思。但是,我的node_模块和Composer的供应商目录不在容器内,因此不会真正影响其状态,因此它看起来不像是影响容器构建的业务。我确实根据您的建议创建了一个脚本,使用docker exec运行必要的脚本,它工作得很好:)我看到这些文件位于应用程序卷中。这仍然不会改变情况——更改这些文件显然会改变代码流,因此需要重新生成图像。为了说明我的情况,假设其中一个文件发生语法错误,这将在运行命令时导致错误,并且可能导致容器运行的进程失败。在构建体系结构时要考虑到这一点。不管怎样,很高兴它帮助了你。祝你过得愉快。