单独的Dockerrun.aws.json文件用于登台和制作

时间:2018-05-03 19:10:50

标签: amazon-web-services amazon-elastic-beanstalk dockerrun.aws.json

处理Dockerrun.aws.json文件的登台和生产部署的最佳方法是什么?有没有办法将变量传递给图像值等,或者每个环境有多个Dockerrun.aws.json文件?目前我的staging env将图像标记为分段,生产将图像标记为生产,但我需要每个env的Dockerrun.aws.json不同?我要么想做点什么:

"image": "${IMAGE}",

其中IMAGE在每个环境的配置中定义或将每个文件分开。因此,我可以根据分段或制作设置不同的容器。

2 个答案:

答案 0 :(得分:5)

古老的问题,但是如果它可以帮助其他人,我想做几乎相同的事情并将其自动化,因此,作为一种快速的实现方法,我想到了一个简单的shell脚本。

这个想法是要有一个包含动态ENV属性的Dockerrun.aws.json模板文件,然后根据所需的环境,脚本将使用此模板并生成适当的Dockerrun.aws.json文件。

示例:

创建具有以下内容的shell脚本:

#!/bin/bash

# current script directory path
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# $1 will be the environement name passed to the script : it can only be dev or prod
# if empty, we ask for user input for convenience
if [ "$1" == "" ]; then
  echo -n "Enter your the environment (either 'dev' or 'prod') and press [ENTER]:"
  read ENV
else
  ENV=$1
fi

# check if environment name is valid
if [ "$ENV" == "dev" ] || [ "$ENV" == "prod" ] ; then

  # move to shell script directory
  cd $DIR

  # generate Dockerfile from template by replacing the ENV property by the input
  echo "Generating Dockerrun.aws.json..."
  sed -e "s/\${ENV}/$ENV/g" Dockerrun.aws.json.template > Dockerrun.aws.json

  # do other things here if necessary

else
  echo "$ENV is not a valid environment name, accepted values : env & prod"
  exit 0
fi

然后创建您的Dockerrun.aws.json.template文件:

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "phpfpm-image-${ENV}",
      #...
    },
    {
      "name": "nginx-proxy",
      "image": "nginx-image-${ENV}",
      #...
    }
  ]
}

现在,只需将shell脚本放在Dockerrun.aws.jon.template文件所在的位置,然后像这样运行它:

sh yourscript.sh dev

它将生成一个有效文件供您在给定的环境中使用。

这是一个简单的示例,为您提供了如何执行操作的基本概念,然后您可以从中构建更复杂的内容。我个人使用它来选择所有正确的配置文件(.ebextensions等),然后将整个内容压缩后上传到beantalk。

答案 1 :(得分:0)

一种方法可能是拥有一个Makefile并具有用于在单独环境中进行部署的单独命令,例如“ make deploy-staging”或“ make deploy-prod”。在内部,该命令将通过将env特定值插值到模板Dockerrun.aws文件来动态生成Dockerrun.aws.json。