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

sdnqo3pr  于 2023-10-17  发布在  Nginx
关注(0)|答案(2)|浏览(139)

我试图创建我自己的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

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机器上运行完美,以及为什么rc-service nginx status告诉nginx服务停止,即使它不是?
先谢谢你
顺便说一下,当我运行这个命令nginx -s reload时,它没有任何错误。

ttisahbt

ttisahbt1#

经过调试和大量的试验和错误,我找到了一个完美的解决方案,至少对我来说,大卫迷宫的答案是非常有帮助的,但我需要能够重新启动容器内的nginx服务。
当我使用以下命令启动容器时:

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

我们访问容器 shell ,我们需要下载nginx服务器,和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

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

/ # 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没有 Boot ,并且有一个丢失的文件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

希望我说清楚了。

cfh9epnr

cfh9epnr2#

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

相关问题