如何使用 rc-service 命令在 alpine:latest 映像中启动 Nginx 服务器

How to start Nginx server within alpine:latest image using rc-service command

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

rc-service nginx status
 * status: stopped

当我尝试启动该服务时,这就是它给我的信息,如下所示:

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

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

所以我打开了我的docker机器的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

这是我的docker文件:

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

run.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

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

提前致谢。

顺便说一下,当我 运行 这个命令 nginx -s reload 时,它没有任何错误。

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

在您的 Docker 文件中,您可以将主要命令设置为将 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

经过调试和大量的反复试验,我找到了一个至少对我来说是完美的解决方案,David Maze 的回答很有帮助,但对于 testing 目的我需要我的 shell 可以访问,因为当你 运行 nginx -g "daemon off;" 你不能访问你的容器 shell 除非你停止命令进程。

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

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

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

/ # apk update
/ # apk add nginx openrc

#答案 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

#答案 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

希望我说清楚了。