【问题标题】:How to access scripts in different Docker containers from a single place?如何从一个地方访问不同 Docker 容器中的脚本?
【发布时间】:2016-10-20 02:27:28
【问题描述】:

设置:

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

  • nginx
  • php_fpm
  • php_queue
  • app [数据容器]
  • mysql
  • sockets [运行 websocket 服务器的 nodejs 容器]
  • redis

[我将在下面发布 docker-compose.yml]

问题:

如您所见,我这里有很多相互通信的容器,有时我需要在它们中运行命令。例如,有时我需要在php_queue 容器中运行php artisan ... 命令或在nodejs 容器中运行gulp

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

问题:

是否可以从一个地方访问必要的脚本(gulpphp artisannpmcomposer 等),无论是主机还是另一个容器?

可能的解决方案:

我想添加另一个容器来安装所有引擎(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

【问题讨论】:

    标签: laravel docker docker-compose


    【解决方案1】:

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

    【讨论】:

    • 这也是一个很好的方法,比拥有一个主容器更好。但我的问题更多是关于 docker 简化该任务的内置方法。无论如何谢谢:)
    • 请注意,您想要做的实际上与 docker 哲学有些矛盾。实现目标的 docker 方法是在每次图像更改时重建图像(例如当 gulpfile 或 package.json 更改时)。在正在运行的容器上执行命令可以进行试验,但在尝试开发容器进程时不是一个好习惯。因此 - docker 方式将是每次运行重建映像,运行要在 dockerfile 中执行的命令
    • 我明白你的意思。但是,我的 node_modules 和 Composer 的 vendor 目录不在容器内,因此不会真正影响其状态,因此它看起来不像是影响容器构建的业务。
    • 我确实根据您的建议创建了一个脚本,该脚本使用 docker exec 运行必要的脚本,效果很好:)
    • 我看到这些文件位于应用程序卷中。这仍然没有改变这种情况 - 更改这些文件显然会改变您的代码流程,因此需要重新构建图像。为了让我的情况清楚 - 想象其中一个文件的更改有语法错误 - 这会在运行命令时导致错误,并且可能会使容器运行的进程失败。在构建架构时要考虑到这一点。无论如何,很高兴它帮助了你。祝你好运。
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2017-07-12
    • 2017-10-26
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多