sch*_*ing 20 shell proxy nginx environment-variables docker
我有以下场景:我$SOME_IP
定义了一个env变量,并希望在nginx块中使用它.参考nginx文档,我env
在nginx.conf
文件中使用如下指令:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
env SOME_IP;
Run Code Online (Sandbox Code Playgroud)
现在我想将变量用于a proxy_pass
.我尝试过如下:
location / {
proxy_pass http://$SOME_IP:8000;
}
Run Code Online (Sandbox Code Playgroud)
但我最终得到此错误消息: nginx: [emerg] unknown "some_ip" variable
Mic*_*ksa 36
envsubst
在容器启动时应用于配置文件的模板。envsubst
包含在官方 NGINX docker 镜像中。
环境变量以表单$VARIABLE
或${VARIABLE}
.
nginx.conf.template:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
access_log off;
return 200 '${MESSAGE}';
add_header Content-Type text/plain;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM nginx:1.17.8-alpine
COPY ./nginx.conf.template /nginx.conf.template
CMD ["/bin/sh" , "-c" , "envsubst < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
Run Code Online (Sandbox Code Playgroud)
构建并运行docker:
docker build -t foo .
docker run --rm -it --name foo -p 8080:80 -e MESSAGE="Hellou World" foo
Run Code Online (Sandbox Code Playgroud)
注意:如果配置模板包含$
不应被替换的美元符号,则列出所有使用的变量作为参数,envsubst
以便仅替换这些变量 。例如:
CMD ["/bin/sh" , "-c" , "envsubst '$USER_NAME $PASSWORD $KEY' < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
Run Code Online (Sandbox Code Playgroud)
Nginx Docker 文档供参考。查找在 nginx 配置中使用环境变量。
在 nginx 配置中使用环境变量
开箱即用的 nginx 不支持大多数配置块内的环境变量。但是,如果您需要在 nginx 启动之前动态生成 nginx 配置,可以使用 envsubst 作为一种解决方法。
这是一个使用 docker-compose.yml 的示例:
Run Code Online (Sandbox Code Playgroud)web: image: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=foobar.com - NGINX_PORT=80 command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
mysite.template
然后该文件可能包含这样的变量引用:
listen ${NGINX_PORT}
;
kik*_*ito 27
您可以通过模块访问变量 - 我找到了使用Lua和Perl执行此操作的选项.
在我公司的博客上写到:
TL; DR:
env API_KEY;
Run Code Online (Sandbox Code Playgroud)
然后:
http {
...
server {
location / {
# set var using Lua
set_by_lua $api_key 'return os.getenv("API_KEY")';
# set var using perl
perl_set $api_key 'sub { return $ENV{"API_KEY"}; }';
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:原始博客已死,更改链接到返回机器缓存
正确的用法是$SOME_IP_from_env
,但是从nginx.conf设置的环境变量不能在服务器,位置或http块中使用.
如果使用openresty包(包括Lua),则可以使用环境变量.
从 nginx 1.19 开始,您现在可以使用 docker-compose 在您的配置中使用环境变量。我使用了以下设置:
# file: docker/nginx/templates/default.conf.conf
upstream api-upstream {
server ${API_HOST};
}
# file: docker-compose.yml
services:
nginx:
image: nginx:1.19-alpine
environment:
NGINX_ENVSUBST_TEMPLATE_SUFFIX: ".conf"
API_HOST: api.example.com
Run Code Online (Sandbox Code Playgroud)
我在其他线程上找到了这个答案:https : //stackoverflow.com/a/62844707/4479861
归档时间: |
|
查看次数: |
51530 次 |
最近记录: |