Azure ML中Docker设置的环境变量无法通过Python代码读取问题
问题
我们通过程序化方式生成Dockerfile来创建Azure ML环境,Dockerfile内容如下:
FROM mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04 RUN rm /bin/sh && ln -s /bin/bash /bin/sh RUN echo "source /opt/miniconda/etc/profile.d/conda.sh && conda activate" >> ~/.bashrc RUN echo $'channels:\n\ - anaconda\n\ - conda-forge\n\ - defaults\n\ dependencies:\n\ - python=3.8.10\n\ - pip:\n\ - azureml-sdk==1.50.0\n\ - azureml-dataset-runtime==1.50.0\n\ - azure-storage-blob\n\ - numpy==1.23.5\n\ - pandas==2.0.0\n\ - scipy==1.5.2\n\ - scikit-learn==1.2.2\n\ - azure-eventgrid==4.9.0\n\ - conda:\n\ - conda=23.3.0' > conda_env.yml RUN source /opt/miniconda/etc/profile.d/conda.sh && conda activate && conda install conda && pip install cmake && conda env update -f conda_env.yml ENV cluster_identity_name=clisyer-ide-name ENV cluster_identity_id=1234567 ENV data_drift_event_topic_name=someName ENV sa_name=someStorage
镜像构建成功,日志显示环境变量已正确配置。但用以下Python代码访问该环境时:
if environment_name in environments: restored_environment = environments[environment_name] logging.info('Found environment: %s:%s', restored_environment.name, restored_environment.version)
能正常获取环境名称和版本,但打印环境变量时仅显示示例变量,看不到Dockerfile里设置的自定义变量。不过查看环境定义的JSON时,能看到这些自定义ENV配置。请问这是访问方式有误吗?
原因与解决办法
这是因为通过Azure ML SDK获取的Environment对象,其environment_variables属性只会显示显式添加到环境配置中的变量,而Dockerfile里通过ENV指令设置的变量属于镜像层面的配置,不会自动同步到SDK对象的这个属性里。
要获取Dockerfile中定义的环境变量,有两种可行方式:
- 方式一:解析环境的Dockerfile内容
从restored_environment.dockerfile属性中提取ENV行,自行解析变量:if environment_name in environments: restored_environment = environments[environment_name] # 解析Dockerfile中的ENV指令 dockerfile_content = restored_environment.dockerfile env_vars = {} for line in dockerfile_content.split('\n'): line = line.strip() if line.startswith('ENV'): parts = line.split('=', 1) if len(parts) == 2: key = parts[0].replace('ENV ', '').strip() value = parts[1].strip() env_vars[key] = value logging.info('Dockerfile中定义的环境变量: %s', env_vars) - 方式二:在创建环境时显式同步变量
如果希望SDK对象的environment_variables能直接显示这些变量,在创建环境时,把Dockerfile里的ENV变量同时添加到环境的environment_variables字典中,这样后续通过SDK获取时就能直接访问。
你提到查看环境定义的JSON能看到自定义ENV配置,是因为JSON里包含了完整的Dockerfile内容,而SDK对象的属性做了分层处理,没有自动提取镜像层面的变量。
内容的提问来源于stack exchange,提问作者Obiii
相关产品推荐
相关产品推荐

