nginx在docker容器中自动生成配置文件

2025-05-27 0 102

公司在搭建docker自动化部署时,需要制作一个nginx镜像在其docker run时通过外部指定环境变量使得容器中的配置文件自动生成,不需要再到容器里改配置文件

实现思路

最后运行的命令大概是这样:

?

1
docker run -d -p 80:80 -e xxx=xx 镜像名称 镜像中脚本路径

这里的脚本会代替dockerfile中的CMD指令,所以我们要构建一个自动生成且启动nginx的shell脚本。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
#!/bin/bash

#从环境变量里面获取lt开头,为了与其他环境变量区别开,例如lt_analysis=172.17.0.1:8083

result=""

for a in $(env | grep ^lt)

do

OLD_IFS="$IFS"

IFS="_"

arr=($a)

b=${arr[1]}

IFS="="

arr=($b)

IFS="$OLD_IFS"

result="${result}

location /${arr[0]}/ {

proxy_pass http://${arr[1]}/${arr[0]}/;

proxy_connect_timeout 90;

proxy_send_timeout 90;

proxy_read_timeout 90;

}"

done

#将nginx配置文件中nginx_conf中置换成变量result

sed -i "s|nginx_conf|$(echo ${result})|g" /etc/nginx/nginx.conf

cd /usr/sbin

./nginx

需要说明的一点是业务中并不需要将整个配置文件生成,只需要将其中location生成然后替换原配置文件中标记的位置,下面就是原配置文件标记的位置。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
http {

...

server {

...

location / {

root html;

index index.html index.htm;

}

nginx_conf

#error_page 404 /404.html;

...

我以为将这个shell脚本和默认的配置文件放入nginx的dockerfile镜像中,然后就成功了,但是…运行上述命令之后容器没有起来,查看容器日志,出来的信息却是***Syntax error: “(” unexpected***。我的shell脚本在centos上经过测试是可以运行的,那么为什么会报这个错呢? 经过排查,原来是dockerfile使用基础镜像是官方nginx,官方的镜像使用Ubuntu不再使用bash来而是dash执行shell脚本,真是个坑 。没办法我只好修改dockerfile,下面就是使用基础镜像centos。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62
FROM centos

ENV NGINX_VERSION 1.10.3

ENV OPENSSL_VERSION 1.0.2k

ENV PCRE_VERSION 8.40

ENV ZLIB_VERSION 1.2.11

ENV BUILD_ROOT /usr/local/xx/nginx

# 为了减小最终生成的镜像占用的空间,这里没有执行yum update命令,可能不是好的实践

# 为了加快构建速度,这里使用了163的安装源

#RUN yum -y update \\

RUN yum -y install curl \\

&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \\

&& curl http://mirrors.163.com/.help/CentOS7-Base-163.repo -o /etc/yum.repos.d/CentOS7-Base-163.repo \\

&& yum -y install gcc gcc-c++ make perl zip unzip \\

&& mkdir -p $BUILD_ROOT \\

&& cd $BUILD_ROOT \\

&& curl https://ftp.pcre.org/pub/pcre/pcre-$PCRE_VERSION.zip -o $BUILD_ROOT/pcre-$PCRE_VERSION.zip \\

&& curl https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz -o $BUILD_ROOT/openssl-$OPENSSL_VERSION.tar.gz \\

&& curl http://www.zlib.net/zlib-$ZLIB_VERSION.tar.gz -o $BUILD_ROOT/zlib-$ZLIB_VERSION.tar.gz \\

&& curl https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o $BUILD_ROOT/nginx-$NGINX_VERSION.tar.gz \\

&& tar vxzf nginx-$NGINX_VERSION.tar.gz \\

&& unzip pcre-$PCRE_VERSION.zip \\

&& tar vxfz zlib-$ZLIB_VERSION.tar.gz \\

&& tar vxfz openssl-$OPENSSL_VERSION.tar.gz \\

&& cd nginx-$NGINX_VERSION \\

&& BUILD_CONFIG="\\

--prefix=/etc/nginx \\

--sbin-path=/usr/sbin/nginx \\

--conf-path=/etc/nginx/nginx.conf \\

--error-log-path=/var/log/nginx/error.log \\

--http-log-path=/var/log/nginx/access.log \\

--pid-path=/var/run/nginx.pid \\

--lock-path=/var/run/nginx.lock \\

--http-client-body-temp-path=/var/cache/nginx/client_temp \\

--http-proxy-temp-path=/var/cache/nginx/proxy_temp \\

--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \\

--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \\

--http-scgi-temp-path=/var/cache/nginx/scgi_temp \\

--with-openssl=$BUILD_ROOT/openssl-$OPENSSL_VERSION \\

--with-pcre=$BUILD_ROOT/pcre-$PCRE_VERSION \\

--with-zlib=$BUILD_ROOT/zlib-$ZLIB_VERSION \\

--with-http_ssl_module \\

--with-http_v2_module \\

--with-threads \\

" \\

&& mkdir -p /var/cache/nginx \\

&& ./configure $BUILD_CONFIG \\

&& make && make install \\

&& rm -rf $BUILD_ROOT \\

&& yum -y remove gcc gcc-c++ make perl zip unzip \\

&& yum clean all

#替换nginx默认文件

COPY nginx.conf /etc/nginx/

#添加自动生成配置文件的shell脚本

COPY 脚本名称 /root/

#暴露端口

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

提醒:docker容器不支持后台运行,当命令执行之后,容器也会自然退出,这里我们需要将nginx配置文件设置一下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
#user nobody;

worker_processes 1;

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

#pid logs/nginx.pid;

daemon off; //这里添加,关闭后台运行

events {

worker_connections 1024;

}

http {

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://juejin.im/post/5cf2a76be51d45590a445aeb

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 nginx在docker容器中自动生成配置文件 https://www.kuaiidc.com/65643.html

相关文章

发表评论
暂无评论