nginx docker alpine envsubst不';如果有';docker compose中的一个命令
我想将envsubst与nginx docker alpine一起使用: 在nginx配置中使用环境变量(1.19中新增) nginx开箱即用,内部不支持环境变量 大多数配置块。但是这个图像有一个功能,它将 在nginx启动之前提取环境变量 以下是使用docker-compose.yml的示例: web:image:nginx卷:nginx docker alpine envsubst不';如果有';docker compose中的一个命令,docker,nginx,docker-compose,Docker,Nginx,Docker Compose,我想将envsubst与nginx docker alpine一起使用: 在nginx配置中使用环境变量(1.19中新增) nginx开箱即用,内部不支持环境变量 大多数配置块。但是这个图像有一个功能,它将 在nginx启动之前提取环境变量 以下是使用docker-compose.yml的示例: web:image:nginx卷: /模板:/etc/nginx/模板端口: “8080:80”环境: NGINX_HOST=foobar.com NGINX_端口=80 默认情况下,此函数读取中的
- /模板:/etc/nginx/模板端口:
- “8080:80”环境:
- NGINX_HOST=foobar.com
- NGINX_端口=80
version: '3'
services:
nginx:
image: nginx:alpine
restart: unless-stopped
volumes:
#- ./data/nginx:/etc/nginx/conf.d
- ./templates:/etc/nginx/templates
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- "80:80"
- "443:443"
env_file: .env
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
运行此服务时,envsubt不工作。但是,如果我删除docker compose中的命令:
,它确实可以工作
我尝试将该命令复制到一个.sh文件中,并将其移动到容器内部的/docker entrypoint.d/mycommand.sh
。默认情况下,此处还有几个在加载nginx之前运行的.sh文件:
ls -l docker-entrypoint.d
total 16
-rwxrwxr-x 1 root root 1961 May 25 15:44 10-listen-on-ipv6-by-default.sh
-rwxrwxr-x 1 root root 1037 May 25 15:44 20-envsubst-on-templates.sh
-rwxrwxr-x 1 root root 4613 May 25 15:44 30-tune-worker-processes.sh
我也用一个卷在那里添加了mycommand.sh
。下面是mycommand.sh的样子:
#! /bin/bash
# reload nginx config every 60 seconds in case certs get updated
while :; do
sleep 60
echo reloading
nginx -s reload
done
然而,当我将此脚本添加到/docker entrypoint.d
目录时,nginx似乎从未启动
根据文档,如何使用nginx alpine运行命令并使用envsubt
我更愿意走这条路,而不是使用一个带有共享卷的新nginx容器来获得相同的结果。将.sh脚本添加到
docker entrypoint.d
“感觉”像是“正确”的方式,将导致更简单的docker编写。更改命令无效,因为/docker entrypoint.sh
包含:
if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then
...
当您更改命令时,$1
变为/bin/sh
/docker entrypoint.d
中的脚本需要在docker entrypoint.sh
到达运行命令的末尾之前运行并退出(默认情况下,启动nginx)。您可以将while循环放在后台以实现这一点,只需在完成后附加一个&
:
#! /bin/bash
# reload nginx config every 60 seconds in case certs get updated
while :; do
sleep 60
echo reloading
nginx -s reload
done &
注意,这在很大程度上是一种反模式,容器通常只在开发环境中才有意义。在生产中,您将使用新配置重新部署新容器。更改命令无效,因为
/docker entrypoint.sh
包含:
if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then
...
当您更改命令时,$1
变为/bin/sh
/docker entrypoint.d
中的脚本需要在docker entrypoint.sh
到达运行命令的末尾之前运行并退出(默认情况下,启动nginx)。您可以将while循环放在后台以实现这一点,只需在完成后附加一个&
:
#! /bin/bash
# reload nginx config every 60 seconds in case certs get updated
while :; do
sleep 60
echo reloading
nginx -s reload
done &
注意,这在很大程度上是一种反模式,容器通常只在开发环境中才有意义。在生产中,您将使用新配置重新部署一个新容器