nginx docker官方镜像添加自定义命令自动退出

当在Nginx Docker官方镜像中添加自定义启动命令时,如果不正确配置可能导致容器启动后立即退出。本文介绍如何通过在CMD中加入-g 'daemonoff' 参数来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx docker官方镜像添加自定义启动命令自动退出

​ 今天在启动nginx官方镜像的时候想在启动后执行一些CMD命令,但发现每次执行完CMD命令后镜像会自动退出,在网上查找后发现:

​ If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

译文:

​ 如果你再Dockerfile中添加了一条自定义的CMD命令,为了使nginx保持在前台运行请确定CMD命令中包含参数 -g daemon off; ,这样Docker才能正确的跟踪进程(否则你的容器回在启动后立即停止)

​ 再从docker的运行机制来说明:

​ docker判断容器是否运行的依据是容器内pid(进程号)为1的进程是否结束,一旦pid=1的进程结束后容器也会随之退出。

​ 在未添加自定义的CMD命令时,nginx容器中pid=1的进程是nginx,而添加了CMD命令后,这条自定义的CMD命令的pid变成了1,而nginx进程转为守护线程的方式来执行,当自定义的CMD命令执行结束后,容器便会随之退出!

解决方法 : 添加全局参数 -g ‘daemon off’;

解释:设置nginx不以守护线程的方式运行,这样nginx始终保持进程号pid=1,这样容器就会随着nginx一直运行下去。

示例:

  • dockerfile

    FROM nginx:latest
    CMD echo "hello" && exec nginx -g 'daemon off;'
    
  • 命令行

    docker run -itd nginx:latest /bin/bash echo "hello" && exec nginx -g 'daemon of f;'
    

    纯属个人理解,若有不足还请指正!

参考博客:

Docker启动Nginx容器有entrypoint或command

Nginx是用于HTTP,HTTPS,SMTP,POP3和IMAP协议的开源反向代理服务器,以及负载平衡器,HTTP缓存和Web服务器(原始服务器)。Nginx项目一开始就非常关注高并发,高性能和低内存使用。它获得了两节式BSD许可,并在Linux,BSD变体,Mac OS X,Solaris,AIX,HP-UX以及其他* nix版本上运行。它还具有用于Microsoft Windows的概念证明端口。 托管一些简单的静态内容 $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx 或者,Dockerfile可以使用简单的方法来生成包含必要内容的新图像(这比上面的绑定安装要干净得多): FROM nginx COPY static-html-directory /usr/share/nginx/html 将此文件放置在与目录相同的目录中(“ static-html-directory”),运行docker build -t some-content-nginx .,然后启动容器: $ docker run --name some-nginx -d some-content-nginx 暴露外部端口 $ docker run --name some-nginx -d -p 8080:80 some-content-nginx 然后,您可以在浏览器中点击http://localhost:8080或http://host-ip:8080。 复杂的配置 $ docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx 有关nginx配置文件的语法的信息,请参阅官方文档(特别是《入门指南》)。 如果您希望采用默认配置,请使用以下类似内容从运行的nginx容器中复制它: $ docker run --name tmp-nginx-container -d nginx $ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf $ docker rm -f tmp-nginx-container 也可以使用简单的Dockerfile(在中/host/path/)更干净地完成此操作: FROM nginx COPY nginx.conf /etc/nginx/nginx.conf 如果您CMD在Dockerfile中添加自定义,请确保将包含-g daemon off;在其中CMD,以使nginx保持在前台,以便Docker可以正确跟踪进程(否则您的容器将在启动后立即停止)! 然后使用构建图像docker build -t custom-nginx .并按如下所示运行它: $ docker run --name my-custom-nginx-container -d custom-nginxNginx配置中使用环境变量 现成的nginx不支持大多数配置块中的环境变量。但是,envsubst如果您需要在nginx启动之前动态生成nginx配置,则可以将其用作解决方法。 这是使用docker-compose.yml的示例: 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/default.conf && exec nginx -g 'daemon off;'" mysite.template然后,该文件可能包含如下变量引用: listen ${NGINX_PORT}; 在只读模式下运行Nginx 要以只读模式运行nginx,您需要将Docker卷安装到nginx写入信息的每个位置。默认的nginx配置需要对/var/cache和的写权限/var/run。可以通过如下运行nginx轻松地完成此操作: $ d
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值