我有一个使用Docker Compose设置的项目。当我或我的团队中的任何人从事该项目时,使一切正常运行就很容易了。我们还具有与生产环境关联的Docker Machine(“默认”)。所以我们只需要通过以下方式连接到机器:
docker-compose up
现在,部署与使一切都在本地运行完全相同。只是eval "$(docker-machine env default)"
。我喜欢这个!
但是,现在Compose配置被分为三个文件:
docker-compose up
:常规内容。适用于生产环境和本地环境。 docker-compose.yml
:仅适用于本地环境。docker-compose.override.yml
:仅适用于生产环境。[方便地,docker-compose会自动读取docker-compose.production.yml
和docker-compose.yml
,因此在本地环境中,我们仍然可以运行docker-compose.override.yml
而无需其他参数。在生产环境中,我们需要明确:
docker-compose up
这更冗长,当您习惯只运行docker-compose -f docker-compose.yml -f docker-compose.production.yml up
时,很容易忘记其他参数。我曾经有过无缝的经验:使用单个命令连接到计算机,然后使用与本地环境中相同的命令。
我发现您可以通过设置环境变量docker-compose up
使docker-compose默认为另一套配置文件。因此,到目前为止,我的首选解决方案是在连接到计算机时运行two命令:
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"
的输出,因此当我想连接到计算机时,我返回运行single命令。
如果这不可能(我找不到来源),是否有其他方法可以解决此问题?
当然,我可以编写一个仅包含两个命令的shell脚本,但我希望使用惯用的解决方案。
如果仅在没有docker-machine env default
包装程序的情况下运行docker-compose env
命令,它将写出一系列Shell命令。您可以将其与另一个运行eval
的脚本进行包装,并添加其他设置
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"'
它会打印出设置环境的shell命令;使其真正生效,您可以
./docker_production
以同样的方式,您可以编写一个输出命令来撤消此命令的shell脚本
eval $(./docker_production)
#!/bin/sh
# I am docker_development
docker-compose env -u
echo 'unset COMPOSE_FILE'
echo 'PS1="${PS1#PRODUCTION }"'