我正在尝试从Docker容器运行UWSGI服务器。我已经取得了成功,但是我遇到了麻烦,因为我希望将初始/bin/bash
进程替换为UWSGI进程后,容器启动后,我的入口点脚本仍将以PID 1作为root用户运行:
bash-4.4# ps aux
PID USER TIME COMMAND
1 root 0:00 {docker-entrypoi} /bin/bash /usr/local/bin/docker-entrypoint.sh
19 myuser 0:00 uwsgi --ini /opt/mysite/uwsgi.ini
21 myuser 0:00 uwsgi --ini /opt/mysite/uwsgi.ini
22 myuser 0:00 uwsgi --ini /opt/mysite/uwsgi.ini
24 myuser 0:02 python3 ./manage.py qcluster
28 myuser 0:00 python3 ./manage.py qcluster
29 myuser 0:00 python3 ./manage.py qcluster
30 myuser 0:00 python3 ./manage.py qcluster
31 myuser 0:00 python3 ./manage.py qcluster
32 myuser 0:00 python3 ./manage.py qcluster
33 myuser 0:00 python3 ./manage.py qcluster
34 myuser 0:00 python3 ./manage.py qcluster
我已经尝试过使用exec
和su-exec
进行一些变体,但是我仍然遇到上述问题。我需要在启动时向UWSGI提供PEM密码,所以我一直在使用如下语法:
echo $PEM_PASSPHRASE | exec uwsgi --ini /opt/mysite/uwsgi.ini
这可以很好地启动和运行,但是我仍然可以运行PID 1 /bin/bash
进程,下面是UWSGI进程的子进程。我觉得我缺少一些明显的细节,实际上无法通过exec
将bash进程替换为UWSGI进程。
对于它的价值,我仅在Dockerfile中使用ENTRYPOINT,而不是CMD:
ENTRYPOINT ["docker-entrypoint.sh"]
朝正确方向的任何指针将不胜感激。
您拥有的命令将被放置为ENTRYPOINT
,因为它的命令将是第一个过程。 (我假设您是从docker-entrypoint.sh
内部调用它的)
ENTRYPOINT ["echo $PEM_PASSPHRASE | exec uwsgi --ini /opt/mysite/uwsgi.ini"]