node.js - docker build 卡在 pm2 start
问题描述
我想创建一个 docker 容器。我写了一个像这样的Docker文件
FROM node:12-buster
WORKDIR /opt/myapps/
COPY . /opt/myapps/
RUN apt update
RUN apt upgrade -y
RUN apt install git -y
RUN git config --global user.email "user@git.com"
RUN git config --global user.name "user"
RUN npm install -g pm2
RUN pm2-runtime main.js
RUN pm2 save
RUN chmod +x /opt/myapps/entrypoint.sh
EXPOSE 4001
CMD ["./entrypoint.sh"]
这是我的 entrypoint.sh
#!/bin/bash
#node thing
npm install
#npm start
pm2-runtime main.js --exp-backoff-restart-delay=100
当我进行构建时,它肯定会陷入这样的最终过程
Step 10/14 : RUN pm2-runtime main.js
---> Running in 6061a8236379
2021-03-09T12:38:20: PM2 log: Launching in no daemon mode
2021-03-09T12:38:20: PM2 log: App [main:0] starting in -fork mode-
2021-03-09T12:38:20: PM2 log: App [main:0] online
Server started on port :4001
当它到达那里时,这个过程从未继续。有谁知道为什么会这样?我对码头工人世界很陌生
解决方案
docker 中的 RUN 步骤执行命令,等待命令退出,并将对容器文件系统的更改捕获为映像中的新层。因此 docker 将等到 pm2 start 命令退出,它不会出现它会退出,因为它是在端口上侦听请求的服务。
对于运行服务,您通常希望此运行作为容器的入口点以在容器运行时访问服务,而不是在映像构建期间启动它。
在高层次上,您希望将事物分成三个桶:
- 为应用程序安装的二进制文件和库,它们位于使用 Dockerfile 创建的映像中
- 持久数据,这在一个卷中
- 配置,这在 compose 文件、kubernetes 清单、环境变量中,或作为文件注入卷中
推荐阅读
- python - 我们如何自定义 Django 中不匹配的密码字段?
- .net - SQLite 与 Powershell - SQLite Datatyp 日期被传输到 Powershell 中的 DateTime
- flutter - 颤振长文本断线
- python - 如何将变量放入pygame密钥检测器?
- java - Java lang NoSuchMethodError:用于 cplex 的 SwigDirector
- python - Conceptnet Numberbatch(多语言)OOV 词
- html - 在 th:each 中的 switch-case 语句中发布表单
- python - Pandas:如果条目已更改,则将数据框合并到另一个数据框中
- amazon-web-services - 无法让 index.html 在嵌套文件夹中的 AWS S3 静态站点上默认工作
- python - 从列表中的子字符串与包含子字符串的字典返回匹配值