在 Alpine 上运行 nginx

Nor*_*gul 4 php nginx docker dockerfile

我想在容器启动时运行 nginx 和 php-fpm,但我似乎无法这样做。这是我的Dockerfile

FROM php:7-fpm-alpine

EXPOSE 9080 8000
EXPOSE 9088 80

WORKDIR /var/www
COPY . .

RUN apk add nginx composer php7-fpm && \
    composer install --no-progress && \
    mkdir -p /etc/nginx /etc/nginx/sites-available /etc/nginx/sites-enabled /run/nginx && \
    ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
    cp nginx.conf /etc/nginx/conf.d/default.conf

CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)

容器启动并运行,但是当我运行ps auxnginx时,在我运行nginx命令之前无处可见(配置正常,nginx -t返回正常,并且通过打开的容器运行它确实启动了服务)。

我试图链接,RUN php-fpm7 && nginx但没有任何作用。

也像使用入口点一样ENTRYPOINT ["nginx"]对我没有任何帮助。

如何确保这些进程在创建容器时正在运行?

Efr*_*tan 9

在同一个容器中运行 2 个进程不是 docker 最佳实践,但我认为这是适合您特定用例的正确方法。幸运的是,docker 为您提供了解决方案。

使用管理工具 - supervisord

supervisord 是为编排多个进程而设计的,我认为它比 shell 脚本更好,因为它为您提供了管理和日志记录功能。创建一个supervisord.conf

[supervisord]
nodaemon=true
logfile=/tmp/supervisord.log
childlogdir=/tmp
pidfile = /tmp/supervisord.pid

[program:php-fpm]
command=php-fpm7 -F
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=false
startretries=0

[program:nginx]
command=nginx -g 'daemon off;'
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=false
startretries=0
Run Code Online (Sandbox Code Playgroud)

然后安装并将其复制到您的Dockerfile

RUN apk add supervisor
COPY ./supervisord.conf /etc/
Run Code Online (Sandbox Code Playgroud)

现在你的入口点应该是:

ENTRYPOINT /usr/bin/supervisord -c /etc/supervisord.conf
Run Code Online (Sandbox Code Playgroud)