Skip to content

podman环境文件的引号问题

Posted on:2023年10月18日 at 00:00

Table of contents

Open Table of contents

背景

本地运行python应用时,我使用一些机密文件传递变量给程序使用。如果把应用容器化,我应该如何传递机密信息呢?第一反应是使用附加卷。其实还有一种方法,就是使用—env-file选项。 使用podman运行容器时可以用—env-file选项传入一个环境文件,以便配置环境变量。但是文件中的变量值如果被单引号或者双引号包裹,引号被视作值的一部分,不会被移除。

官方说明

github issue env-file not handling multiline nor quotes做了一些说明,维护者给出了文档改进的提交记录,标签为v4.7.1。 目前podman官方文档是v.4.6.1,仍未更新。当时查看文档的我一直疑惑为什么官方示例那么少,原来三个月前提交的文档增强还没有合并到主分支。 可以看看docker的相关文档

When running the command, the Docker CLI client checks the value the variable has in your local environment and passes it to the container. If no = is provided and that variable is not exported in your local environment, the variable isn’t set in the container. You can also load the environment variables from a file. This file should use the syntax =value (which sets the variable to the given value) or (which takes the value from the local environment), and # for comments.

如果没有等号=,或者本地没有这个环境变量,那么这个变量不会在容器中配置。

测试

mkdir test-env-file
cd test-env-file
cat > podman.env <<EOF
AWS_REGION_NAME=
AWS_ACCESS_KEY_ID="wffger"
AWS_SECRET_ACCESS_KEY='fakekey'
EOF
cat > test.py <<EOF
import os
print(os.getenv("AWS_REGION_NAME", "default-AWS_REGION_NAME"))
print(os.getenv("AWS_ACCESS_KEY_ID", "default-AWS_ACCESS_KEY_ID"))
print(os.getenv("AWS_SECRET_ACCESS_KEY", "default-AWS_SECRET_ACCESS_KEY"))
print(os.getenv("AWS_S3_BUCKET", "default-AWS_S3_BUCKET"))
EOF

podman run --env-file="podman.env" -it --privileged --rm --name testenvfile -v ${PWD}:/opt python:3.11-slim python /opt/test.py

你也可以用cloud-desk测试:

  1. 准备AWS密钥和存储桶
  2. 下载cloud-desk package
  3. 安照README文档在本地配置环境文件
  4. 运行容器