我正在尝试使用
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
我想知道为什么
rc-service nginx reload
不起作用,即使我的 nginx 服务在我的 docker 机器上完美运行,以及为什么 rc-service nginx status
告诉 nginx 服务已停止,即使它没有停止?
提前致谢。
顺便说一句,当我运行此命令时
nginx -s reload
,它可以正常工作,没有任何错误。
经过调试和大量的试验和错误,我找到了一个完美的解决方案,至少对我来说,David Maze答案非常有帮助,但我需要能够在容器内重新启动nginx服务。
无论何时我使用以下命令启动容器:
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
希望我说清楚了。
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