![无法从 docker 镜像启动容器/如果我们添加 CMD 来启动 filebeat 或 fluentd 代理,则会失败](https://linux22.com/image/776592/%E6%97%A0%E6%B3%95%E4%BB%8E%20docker%20%E9%95%9C%E5%83%8F%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8%2F%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E6%B7%BB%E5%8A%A0%20CMD%20%E6%9D%A5%E5%90%AF%E5%8A%A8%20filebeat%20%E6%88%96%20fluentd%20%E4%BB%A3%E7%90%86%EF%BC%8C%E5%88%99%E4%BC%9A%E5%A4%B1%E8%B4%A5.png)
无法从 Dockerfile 下面构建的 docker 镜像启动容器如果我们添加 CMD 来启动 filebeat 或 fluentd 代理则会失败。
Dockerfile
#################################################
FROM node:12
#install pm2
RUN npm install pm2 -g
RUN apt update
#create dir and copy the code
RUN mkdir -p /home/devops/comera_registration_service/
WORKDIR /home/devops/comera_registration_service/
COPY . .
#fluentd install
COPY fl.sh .
RUN sh fl.sh
#install depend
RUN npm install
#start the app
CMD [ "pm2-runtime", "ecosystem.config.js" ]
CMD ["/etc/init.d/td-agent", "start" ]
#opening port
EXPOSE 3010
答案1
该node:12
图像有一个入口点脚本。当ENTRYPOINT
指定时,Docker 将使用中的值CMD
作为此入口点命令的参数。
可以通过将以下内容添加到 Dockerfile 来禁用父映像入口点:
ENTRYPOINT []
附注:当CMD
在 Dockerfile 中指定多条指令时,只有最后一条指令会设置在生成的图像中。
使用上面的 Dockerfile 并删除父入口点后,/etc/init.d/td-agent
容器的 PID 将是 1。由于这是一个初始化脚本,因此它在启动守护进程后将退出。当 PID 1 消失时,容器将退出。
要在容器内运行多个程序,需要包装脚本或进程管理器。请注意,这通常不推荐。例如,在 Kubernetes 上,sidecar 容器模式是首选。