【问题标题】:How to default to Docker Compose production configuration when connected to dedicated Docker Machine?连接到专用 Docker 机器时如何默认使用 Docker Compose 生产配置?
【发布时间】:2019-11-22 20:11:33
【问题描述】:

我有一个使用 Docker Compose 设置的项目。当我或我团队中的任何人从事该项目时,让一切运行起来只需docker-compose up。我们还有一个与生产环境关联的 Docker Machine(“默认”)。所以我们只需要通过以下方式连接到机器:

eval "$(docker-machine env default)"

现在部署与让一切在本地运行完全一样。只是一个docker-compose up。我喜欢这个!

但是,Compose 配置现在分为三个文件:

  • docker-compose.yml:一般的东西。适用于生产环境和本地环境。
  • docker-compose.override.yml:仅适用于本地环境。
  • docker-compose.production.yml:仅适用于生产环境。

方便的是,docker-compose 会自动读取docker-compose.ymldocker-compose.override.yml,因此在本地环境中我们仍然可以运行docker-compose up 而无需额外的参数。在生产环境中,我们需要明确:

docker-compose -f docker-compose.yml -f docker-compose.production.yml up

这更加冗长,当您习惯于简单地运行docker-compose up 时,很容易忘记附加参数。我从以前获得了无缝体验:使用单个命令连接到机器,然后像在本地环境中一样使用相同的命令。

我发现您可以通过设置环境变量COMPOSE_FILE 使 docker-compose 默认为一组不同的配置文件。所以我现在的首选解决方案是在连接到机器时运行 两个 命令:

eval $(docker-machine env default)
export COMPOSE_FILE="docker-compose.yml:docker-compose.production.yml"

这行得通!我可以像以前一样在生产环境中运行docker-compose up

由于eval $(docker-machine env default) 也只是注册环境变量,我想知道是否可以永久添加这一行:

export COMPOSE_FILE="docker-compose.yml:docker-compose.production.yml"

进入docker-machine env default 的输出,所以当我想连接到机器时,我会返回运行single 命令。

如果这是不可能的(我找不到来源),是否有不同的方法来解决这个问题?

当然,我可以编写一个简单地包含两个命令的 shell 脚本,但我更喜欢惯用的解决方案。

【问题讨论】:

    标签: docker docker-compose docker-machine


    【解决方案1】:

    如果你只运行docker-compose env 命令而不使用eval 包装器,它会写出一系列shell 命令。您可以使用另一个运行 docker-compose env 的脚本来包装它,并添加您的其他设置

    #!/bin/sh
    # I am docker_production
    docker-compose env default
    echo 'export COMPOSE_FILE="docker-compose.yml:docker-compose.production.yml"'
    echo 'PS1="PRODUCTION $PS1"'
    

    如果你运行这个脚本

    ./docker_production
    

    它将打印出设置环境的shell命令;要真正让它生效,你可以

    eval $(./docker_production)
    

    以同样的方式,您可以编写一个输出命令来撤消此操作的 shell 脚本

    #!/bin/sh
    # I am docker_development
    docker-compose env -u
    echo 'unset COMPOSE_FILE'
    echo 'PS1="${PS1#PRODUCTION }"'
    
    eval $(./docker_development)
    

    【讨论】:

    • 我明白了……我的梦想目标是找到一个看起来与项目无关的解决方案。如果有经验的 docker-ist 阅读了我关于如何在本地运行以及如何部署的文档说明,那么理想情况下,他应该会看到他从未见过的任何东西。如果是您的解决方案,他可能想知道这个docker_production 文件中有什么。
    • 我认为您的问题非常清楚地列出了标准工具的功能和局限性。
    • 好吧,我完全可以忍受。我只是想知道是否有我没有看到的标准解决方案。您确定没有(非hacky)方法来扩展docker-machine env 的输出吗?在我看来,这似乎可以在创建机器时以某种方式进行配置。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2018-12-01
    • 2019-04-01
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多