在OpenShift 3.11的S2I构建过程中的环境变量

我确认了在OpenShift 3.11的s2i构建中的环境变量。
在构建(assemble)和部署(run)时,可以访问的环境变量是不同的。

以Python 3.6为基础图像
包含CentOS 7.5-1804的Python 3.6版本的内容

(app-root) sh-4.2$ cat redhat-release
CentOS Linux release 7.5.1804 (Core)

s2i的assemble环境变量

這只是粗略的節選,大致是這樣的。

APP_ROOT=/opt/app-root
EUID=1001
HOME=/opt/app-root/src
HOSTNAME=django2-nginx-ex-11-build
HOSTTYPE=x86_64
LANG=en_US.UTF-8
OPENSHIFT_BUILD_COMMIT=879c53b3ad94796ea8c4c20177a1cd9f7df24b4f
OPENSHIFT_BUILD_NAME=django2-nginx-ex-11
OPENSHIFT_BUILD_NAMESPACE=django2
OPENSHIFT_BUILD_REFERENCE=master
OPENSHIFT_BUILD_SOURCE=https://gitlab.com/imp555/django2-nginx.git
STI_SCRIPTS_PATH=/usr/libexec/s2i
STI_SCRIPTS_URL=image:///usr/libexec/s2i

在运行s2i时的环境变量

在同一个项目中,Pod之间可以相互引用HOST、IP、PORT等信息。例如,有一个用于Python的Pod和一个用于PostgreSQL的Pod,可以通过环境变量在Python的Pod中指定PostgreSQL服务器。

在这种情况下,可以通过将连接到的服务器的服务名称作为DeployConfig的env传递给环境变量,然后使用_SERVICE_HOST获取主机的IP地址,使用_SERVICE_PORT获取主机的端口号。

在这种情况下,将全部转换为大写,并且将”-“变为”_”。

以下是示例:

– Python3.6 的 Pod…DeployConfig 名称为 django-psql-persistent。
– Postgresql 的 Pod…DeployConfig 名称为 postgresql。

中国是Python3.6的Pod…DeployConfig的名称:django2-nginx-ex。

APP_CONFIG=conf/gunicorn.py
APP_ROOT=/opt/app-root
DJANGO2_NGINX_EX_PORT=tcp://172.30.29.98:8000
DJANGO2_NGINX_EX_PORT_8000_TCP=tcp://172.30.29.98:8000
DJANGO2_NGINX_EX_PORT_8000_TCP_ADDR=172.30.29.98
DJANGO2_NGINX_EX_PORT_8000_TCP_PORT=8000
DJANGO2_NGINX_EX_PORT_8000_TCP_PROTO=tcp
DJANGO2_NGINX_EX_SERVICE_HOST=172.30.29.98
DJANGO2_NGINX_EX_SERVICE_PORT=8000
DJANGO2_NGINX_EX_SERVICE_PORT_HTTP=8000
DJANGO_PSQL_PERSISTENT_PORT=tcp://172.30.248.17:8000
DJANGO_PSQL_PERSISTENT_PORT_8000_TCP=tcp://172.30.248.17:8000
DJANGO_PSQL_PERSISTENT_PORT_8000_TCP_ADDR=172.30.248.17
DJANGO_PSQL_PERSISTENT_PORT_8000_TCP_PORT=8000
DJANGO_PSQL_PERSISTENT_PORT_8000_TCP_PROTO=tcp
DJANGO_PSQL_PERSISTENT_SERVICE_HOST=172.30.248.17
DJANGO_PSQL_PERSISTENT_SERVICE_PORT=8000
DJANGO_PSQL_PERSISTENT_SERVICE_PORT_WEB=8000
DJANGO_SECRET_KEY=IRpglBqjX1NLA8n0J8Pu4wTyQIfEsTfcIVLT6vN9gDV****Ur6
EUID=1000170000
HOME=/opt/app-root/src
HOSTNAME=django2-nginx-ex-10-nwdsd
HOSTTYPE=x86_64
KUBERNETES_PORT=tcp://172.30.0.1:443
KUBERNETES_PORT_443_TCP=tcp://172.30.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=172.30.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_HOST=172.30.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
LANG=en_US.UTF-8
MACHTYPE=x86_64-redhat-linux-gnu
OPENSHIFT_BUILD_COMMIT=879c53b3ad94796ea8c4c20177a1cd9f7df24b4f
OPENSHIFT_BUILD_NAME=django2-nginx-ex-11
OPENSHIFT_BUILD_NAMESPACE=django2
OPENSHIFT_BUILD_REFERENCE=master
OPENSHIFT_BUILD_SOURCE=https://gitlab.com/imp555/django2-nginx.git 
POSTGRESQL_PORT=tcp://172.30.7.144:5432
POSTGRESQL_PORT_5432_TCP=tcp://172.30.7.144:5432
POSTGRESQL_PORT_5432_TCP_ADDR=172.30.7.144
POSTGRESQL_PORT_5432_TCP_PORT=5432
POSTGRESQL_PORT_5432_TCP_PROTO=tcp
POSTGRESQL_SERVICE_HOST=172.30.7.144
POSTGRESQL_SERVICE_PORT=5432
POSTGRESQL_SERVICE_PORT_POSTGRESQL=5432
PWD=/opt/app-root/src
STI_SCRIPTS_PATH=/usr/libexec/s2i
STI_SCRIPTS_URL=image:///usr/libexec/s2i
UID=1000170000

在run脚本中使用地址和端口信息。

即使在DeployConfig中将服务名作为Env传递,环境变量也需要将小写转化为大写,并将“-”转化为“_”。

从这里开始就进入了Bash的世界,但我想记录一下我采取的方法。
假设已经通过DeployConfig的Env传递了DJANGO_SERVICE_NAME = “DJANGO_PSQL_PERSISTENT”。

#!/bin/bash -e
:
# -を_にしすべて大文字化します。
django_service_name=${DJANGO_SERVICE_NAME//-/_}
django_service_name=${django_host_name^^}
# サーバーIPの環境変数を取得します。
eval django_host='$'${django_service_name}_PORT_8000_TCP_ADDR
: