nginx docker alpine envsubst不';如果有';docker compose中的一个命令

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 默认情况下,此函数读取中的

我想将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/templates/*.template并输出执行结果 envsubst到/etc/nginx/conf.d

我有一个nginx容器服务,形式如下:

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 &
注意,这在很大程度上是一种反模式,容器通常只在开发环境中才有意义。在生产中,您将使用新配置重新部署一个新容器