首页 > 解决方案 > 连接到专用 Docker 机器时如何默认使用 Docker Compose 生产配置?

问题描述

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

eval "$(docker-machine env default)"

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

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

方便的是,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。我之前有过无缝体验:使用单个命令连接到机器,然后使用与本地环境中相同的命令。

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

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又回到运行单个命令。

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

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

标签: dockerdocker-composedocker-machine

解决方案


如果你只是在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)

推荐阅读