【问题标题】:AWS Batch - How to access AWS Batch environment variables within python script running inside Docker containerAWS Batch - 如何在 Docker 容器内运行的 python 脚本中访问 AWS Batch 环境变量
【发布时间】:2019-10-20 12:28:44
【问题描述】:

我有一个 Docker 容器,它在其中执行一个 python 脚本作为入口点。这是 DockerFile

FROM python:3
ADD script.py / 
EXPOSE 80
RUN pip install boto3
RUN pip install uuid
ENTRYPOINT ["python","./script.py"]

这是 Python 脚本:

import boto3
import time
import uuid
import os

guid = uuid.uuid4()
timestr = time.strftime("%Y%m%d-%H%M%S")
job_index = os.environ['AWS_BATCH_JOB_ARRAY_INDEX']

filename = 'latest_test_' + str(guid) + '_.txt'
with open(filename, 'a+') as f:
    data = job_index
    f.write(data)

client = boto3.client(
    's3',
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='',
    aws_secret_access_key=''
)
response = client.upload_file(filename, 'api-dev-dpstorage-s3', 'docker_data' + filename + '.txt')
with open('response2.txt', 'a+') as f:
    f.write('all done')
    exit

它的设计目的只是为了创建一个文件,将作业数组索引写入文件并将其推送到 S3 Bucket。 AWS Batch 的作业数组索引来自预定义的环境变量之一。我已将图像上传到 AWS ECR,并设置了一个 AWS Batch 来运行一个包含 10 个数组的作业。这应该执行该作业 10 次,我希望将 10 个文件转储到 S3 中,每个文件都包含数组索引工作本身。

如果我不包含环境变量,而只是将值硬编码到文本文件中,则 AWS Batch 作业可以工作。如果我包含对 os.environ 的调用以获取变量,则作业将失败并出现此 AWS Batch 错误:

Status reasonEssential container in task exited

我假设我尝试获取环境变量的方式存在问题。有谁知道我如何正确引用其中一个内置环境变量和/或作业中定义的自定义环境变量?

【问题讨论】:

    标签: python docker aws-batch


    【解决方案1】:

    AWS 通过job definition parameters 提供docker env 配置,您可以在其中指定:

    "environment" : [
        { "AWS_BATCH_JOB_ARRAY_INDEX" : "string"},
    ]
    

    这会变成docker env参数:

    $ docker run --env AWS_BATCH_JOB_ARRAY_INDEX=string $container $cmd
    

    因此可以accessed by:

    import os
    
    job_id = os.environ['AWS_BATCH_JOB_ARRAY_INDEX']
    

    但请注意,如果您以这种方式传递敏感数据,那么以纯文本形式传递凭据是不明智的。相反,在这种情况下,您可能需要创建一个 compute environment

    【讨论】:

    • 谢谢。因此,即使这是 AWS Batch 的“内置”环境变量,我仍然需要在作业定义中手动定义它吗?这似乎不对?由于我不会为此环境变量传递值,因此我希望 AWS 批处理为我提供值(例如,10 个数组作业的作业数组 id 0 到 9?)
    • @JamesMatson 似乎默认情况下它没有传递到 docker env 中。你仍然需要指定 docker 运行时:docs.aws.amazon.com/batch/latest/userguide/… env 变量只存在于批处理 bcs 中,并且 docker 在 bcs 实例启动后在 & 内运行。
    • 谢谢。这不会破坏内置环境变量的目的吗?例如我引用的那个?因为它是由 AWS Batch 提供的,而不是您手动指定的值(例如,在作业定义中指定 AWS_BATCH_JOB_ARRAY_INDEX: 3)。如果必须手动指定,它将不是动态的。我想让容器中的python脚本“知道”它正在运行的作业ID。嗯。可能我误解了这种情况下环境变量的使用。
    • @JamesMatson Batch 计算提供了一个虚拟机(bcs),您可以在 bcs shell 中访问AWS_BATCH_JOB_ARRAY_INDEX 。但是您的 docker 在 shell 内运行,因此无法访问主机(bcs)shell 变量。现在解释了吗?
    猜你喜欢
    • 2021-10-04
    • 2021-03-26
    • 2018-10-19
    • 2019-02-17
    • 2019-01-09
    • 2021-02-21
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多