【问题标题】:How to start Nginx server within alpine:latest image using rc-service command如何在 alpine 中启动 Nginx 服务器:使用 rc-service 命令的最新映像
【发布时间】:2021-01-25 23:50:56
【问题描述】:

我正在尝试创建自己的Nginx 图像,使用apline:latest 图像,在修复了很多错误之后,感谢互联网,我设法做到了,一切正常,但问题是当我运行时以下命令:

rc-service nginx status
 * status: stopped

当我尝试启动服务时,它给了我如下所示:

rc-service nginx start
 * WARNING: nginx is already starting

即使服务已停止,第二个命令的输出告诉它已经启动?!

于是我打开了我的docker-machine的localhost,验证服务是否开启,成功出现nginx html页面。

我尝试运行rc-service nginx reload,结果如下:

rc-service nginx reload
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/blkio/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpu/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuacct/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuset/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/devices/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/freezer/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/hugetlb/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/memory/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_cls/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_prio/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/perf_event/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/pids/tasks: Read-only file system
 * nginx: cannot `reload' as it has not been started

这是nginx -t 的输出:

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

这是less /var/log/nginx/error.log的输出,如下图没有错误:

less: can't open '/var/log/nginx/error.log': No such file or directory

这是我的 dockerfile:

From alpine:latest

COPY nginx.conf ./tmp
COPY index.html ./tmp
COPY run.bash ./tmp
COPY run2.bash ./tmp

RUN apk update && \
    apk add nginx && \
    adduser -D -g 'www' www && \
    mkdir /www && \
    chown -R www:www /var/lib/nginx && \
    chown -R www:www /www && \
    mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig && \
    apk add openrc --no-cache && \
    sh tmp/run.bash

cmd sh tmp/run2.bash

运行.bash:

mv tmp/nginx.conf /etc/nginx/nginx.conf
mv tmp/index.html  /www/index.html

run2.bash:

mkdir /run/openrc
touch /run/openrc/softlevel
mkdir -p /run/nginx
nginx
sh

这是我遵循的指南:

https://wiki.alpinelinux.org/wiki/Nginx

我想知道为什么即使我的 nginx 服务在我的 docker 机器上完美运行,rc-service nginx reload 也无法正常工作,以及为什么rc-service nginx status 告诉 nginx 服务即使没有停止也已停止?

提前致谢。

顺便说一句,当我运行此命令nginx -s reload 时,它可以正常工作。

【问题讨论】:

    标签: docker nginx service dockerfile alpine


    【解决方案1】:

    经过调试和大量试验和错误,我至少找到了一个完美的解决方案,David Maze 的回答非常有帮助,但出于测试 的目的,我需要我的shell 是可访问的,因为当你运行nginx -g "daemon off;" 时,除非你停止命令进程,否则你无法访问你的容器 shell。

    无论何时我使用以下命令启动我的容器:

    docker run -it -p 80:80 -p 443:443 alpine:latest
    

    我们访问容器shell,我们需要下载nginx server 和openrc 才能使用rc-service 命令行。

    / # apk update
    / # apk add nginx openrc
    

    #ANSWER 1

    现在我们将使用以下命令测试 nginx 服务器中是否存在错误:

    / # nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: [emerg] open() "/run/nginx/nginx.pid" failed (2: No such file or directory)
    nginx: configuration file /etc/nginx/nginx.conf test failed
    

    你可以从我们得到的输出中看到,它告诉你应该创建一个丢失的文件或目录,所以让我们创建那个目录:

    / # ls -la run/
    total 8
    drwxr-xr-x    2 root     root          4096 Dec 16 10:31 .
    drwxr-xr-x    1 root     root          4096 Jan 16 08:12 ..
    
    / # mkdir /run/nginx/
    

    我们给那个目录我们创建了一些权限:

    / # chown -R nginx:nginx /run/nginx/
    / # chmod 775 /run/nginx/
    / # ls -la /run/
    total 12
    drwxr-xr-x    1 root     root          4096 Jan 16 08:15 .
    drwxr-xr-x    1 root     root          4096 Jan 16 08:12 ..
    drwxrwxr-x    2 nginx    nginx         4096 Jan 16 08:15 nginx
    

    现在我们可以很好地使用 nginx 了:

    / # nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    rc-service命令测试一下我们的nginx服务是否启动:

    / # rc-service nginx status
     * You are attempting to run an openrc service on a
     * system which openrc did not boot.
     * You may be inside a chroot or you may have used
     * another initialization system to boot this system.
     * In this situation, you will get unpredictable results!
     * If you really want to do this, issue the following command:
     * touch /run/openrc/softlevel
    

    所以从上面的输出我们看到我们有两个问题,openrc没有启动,还有一个文件丢失softlevel

    / # ls -la /run/
    total 12
    drwxr-xr-x    1 root     root          4096 Jan 16 08:15 .
    drwxr-xr-x    1 root     root          4096 Jan 16 08:12 ..
    drwxrwxr-x    2 nginx    nginx         4096 Jan 16 08:22 nginx
    

    让我们首先通过输入openrc 来启动我们的系统:

    / # openrc
     * Caching service dependencies ...
    Service `hwdrivers' needs non existent service `dev'
    
    / # ls -la /run/
    total 16
    drwxr-xr-x    1 root     root          4096 Jan 16 08:29 .
    drwxr-xr-x    1 root     root          4096 Jan 16 08:12 ..
    drwxrwxr-x    2 nginx    nginx         4096 Jan 16 08:22 nginx
    drwxr-xr-x   14 root     root          4096 Jan 16 08:29 openrc
    
    / # ls -la /run/openrc/
    total 64
    drwxr-xr-x   14 root     root          4096 Jan 16 08:29 .
    drwxr-xr-x    1 root     root          4096 Jan 16 08:29 ..
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 daemons
    -rw-r--r--    1 root     root            11 Jan 16 08:29 depconfig
    -rw-r--r--    1 root     root          2895 Jan 16 08:29 deptree
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 exclusive
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 failed
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 hotplugged
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 inactive
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 options
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 scheduled
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 started
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 starting
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 stopping
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 tmp
    drwxr-xr-x    2 root     root          4096 Jan 16 08:29 wasinactive
    

    现在我们创建丢失的文件:

    / # touch /run/openrc/softlevel
    

    现在我们的rc-service 命令完美运行:

    / # rc-service nginx status
     * status: stopped
    

    让我们启动我们的服务器:

     / # rc-service nginx start
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/blkio/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpu/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuacct/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuset/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/devices/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/freezer/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/hugetlb/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/memory/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_cls/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_prio/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/perf_event/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/pids/tasks: Read-only file system
     * Starting nginx ...          [ ok ]
    

    检查是否启动:

    / # rc-service nginx status
     * status: started
    

    #ANSWER 2

    或者你可以简单地调用这两个命令行:

    / # openrc
     * Caching service dependencies ...
    Service `hwdrivers' needs non existent service `dev'    [ ok ]
    
    / # touch /run/openrc/softlevel
    

    现在你可以启动你的 nginx 服务器了 :)

    / # rc-service nginx status
     * status: stopped
    
    / # rc-service nginx start
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/blkio/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpu/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuacct/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuset/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/devices/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/freezer/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/hugetlb/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/memory/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_cls/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_prio/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/perf_event/tasks: Read-only file system
    /lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/pids/tasks: Read-only file system
     * /run/nginx: creating directory
     * /run/nginx: correcting owner
     * Starting nginx ...         [ ok ]
    
    / # rc-service nginx status
     * status: started
    

    希望我是清楚的。

    【讨论】:

    【解决方案2】:

    一个 Docker 容器通常只运行一个进程。您不需要“启动服务”或“重新启动服务”;一般服务器进程本身就是容器的主进程,如果需要重启服务,就重启整个容器。通常,“服务”类型的命令在 Docker 上下文中缺少一些关键的基础设施,因此无法正常工作。

    在您的 Dockerfile 中,您可以将主要命令设置为将 Nginx 作为前台进程启动

    # No need for openrc
    CMD nginx -g "daemon off;"
    

    然后当你需要更改配置时,构建一个新镜像并重新创建容器

    docker build -t my-nginx .
    docker stop nginx
    docker rm nginx
    docker run --name nginx -p 3333:80 -d my-nginx
    

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 2016-11-03
      • 1970-01-01
      • 2016-11-19
      • 2021-04-10
      • 2016-06-13
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多