未设置 AWS ECS 环境变量

AWS ECS Environment variables aren't set

出于某种原因,尽管我在 ECS 任务中配置了环境变量,但它们并未在 运行ning 容器中设置。我错过了什么?为什么值是空的?

我有以下 AWS::ECS::TaskDefinition:

AirflowWebTaskDefinition:
  Type: AWS::ECS::TaskDefinition
  Properties:
    Family: !Join ['', [!Ref 'AWS::StackName', -dl-airflow-web]]
    ContainerDefinitions:
    - Name: dl-airflow-web
      Cpu: '10'
      Essential: 'true'
      Image: companyname-docker-snapshot-local.jfrog.io/docker-airflow:1.0
      Command: ['webserver']
      Memory: '1024'
      LogConfiguration:
        LogDriver: awslogs
        Options:
          awslogs-group: !Ref 'AirflowCloudwatchLogsGroup'
          awslogs-region: !Ref 'AWS::Region'
          awslogs-stream-prefix: dl-airflow-web
      PortMappings:
      -
        ContainerPort: 8080
      Environment:
      - Name: LOAD_EX
        Value: n
      - Name: EXECUTOR
        Value: Celery
      - Name: MYQL_HOST
        Value: !Ref 'RDSDNSName'
      - Name: MYSQL_PORT
        Value: !Ref 'RDSPort'
      - Name: MYSQL_DB
        Value: !Ref 'AirflowDBName'
      - Name: USERNAME
        Value: !Ref 'AirflowDBUser'
      - Name: PASSWORD
        Value: !Ref 'AirflowDBPassword'

我正在使用 docker 图像,它是 https://github.com/puckel/docker-airflow 的一个分支。图片的entrypoint检查环境变量如下:

#!/usr/bin/env bash

AIRFLOW_HOME="/usr/local/airflow"
CMD="airflow"
TRY_LOOP="20"

: ${MYSQL_HOST:="default-mysql"}
: ${MYSQL_PORT:="3306"}

其中 $MYSQL_* 变量如果未在 docker 运行 命令中设置为默认值。

当我 运行 来自 docker-compose 的容器镜像使用下面的配置时,它工作并且环境变量都已设置:

webserver:
  image: companyname-docker-snapshot-local.jfrog.io/docker-airflow:1.0
  environment:
    - LOAD_EX=n
    - EXECUTOR=Celery
    - MYSQL_HOST=mysql
    - MYSQL_PORT=3306
    - USERNAME=dev-user
    - PASSWORD=dev-secret-pw
    - SQS_HOST=sqs
    - SQS_PORT=9324
    - AWS_DYNAMODB_ENDPOINT=http://dynamodb:8000
  ports:
    - "8090:8080"
  command: webserver

在我的 entrypoint.sh 中执行以下命令:

  echo "$(date) - Checking for MYSQL (host: $MYSQL_HOST, port: $MYSQL_PORT) connectivity"

记录此输出:

Fri Jun  2 12:55:26 UTC 2017 - Checking for MYSQL (host: mysql, port: 3306) connectivity

但是检查我的 cloudwatch 日志显示此输出具有默认值:

Fri Jun 2 14:15:03 UTC 2017 - Checking for MYSQL (host: default-mysql, port: 3306) connectivity

但我可以通过 ssh 进入 EC2 主机,运行 docker inspect [container_id] 并验证环境变量是否已设置:

Config": {
    "Hostname": "...",
    "Domainname": "",
    "User": "airflow",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "ExposedPorts": {
        "5555/tcp": {},
        "8080/tcp": {},
        "8793/tcp": {}
    },
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
        "MYSQL_PORT=3306",
        "PASSWORD=rds-secret-pw",
        "USERNAME=rds-user",
        "EXECUTOR=Celery",
        "LOAD_EX=n",
        "MYQL_HOST=rds-cluster-name.cluster-id.aws-region.rds.amazonaws.com",
        "MYSQL_DB=db-name",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "DEBIAN_FRONTEND=noninteractive",
        "TERM=linux",
        "LANGUAGE=en_US.UTF-8",
        "LANG=en_US.UTF-8",
        "LC_ALL=en_US.UTF-8",
        "LC_CTYPE=en_US.UTF-8",
        "LC_MESSAGES=en_US.UTF-8"
    ],
    "Cmd": [
        "webserver"
    ],
    "Image": "companyname-docker-snapshot-local.jfrog.io/docker-airflow:1.0",
    "Volumes": null,
    "WorkingDir": "/usr/local/airflow",
    "Entrypoint": [
        "/entrypoint.sh"
    ],
    "OnBuild": null,
    "Labels": {
        "com.amazonaws.ecs.cluster": "...",
        "com.amazonaws.ecs.container-name": "...",
        "com.amazonaws.ecs.task-arn": "...",
        "com.amazonaws.ecs.task-definition-family": "...",
        "com.amazonaws.ecs.task-definition-version": "16"
    }
},

如果我 运行:

$ docker exec [container-id] echo $MYSQL_HOST

输出为空

您的任务定义定义了环境变量 MYQL_HOST。您在 docker 撰写中做对了。只是 CF,修复它应该没问题。