docker-compose 启动容器后秒退问题小记
起因
今天写了一个给vue项目运行的基础node镜像,Dockerfile内容如下
FROM node:lts-slim
# 修改 npm yarn 加速镜像
RUN npm config set registry=https://registry.npm.taobao.org \
&& yarn config set registry https://registry.npm.taobao.org
# 更改工作目录
WORKDIR /home/node/app
然后用docker-compose来管理
version: '2'
services:
web:
container_name: node_web
build:
context: .
volumes:
- ./:/home/node/app
ports:
- 8888:8080
启动容器:docker-compose up -d
查看容器运行情况:docker-compose ps
结果容器并没有运行,运行docker-compose ps -a
命令发现,容器在启动后短时间内又停止了
知识点
查阅资料发现,docker 容器的生命周期是同容器中的前台进程相关的,如果容器内没有前台进程,容器就会自动停止。
Docker容器仅在它的1号进程(PID为1)运行时,会保持运行
解决方法
在docker-compose中添加tty: true
关键字
version: '2'
services:
web:
container_name: node_web
build:
context: .
volumes:
- ./:/home/node/app
ports:
- 8888:8080
tty: true
tty: true
的作用是为容器分配一个伪终端,就相当于docke run -t
,我的理解是这样就是把/bin/bash
当做前台进程
docker 初学者,如有错误,请指正
本作品采用《CC 协议》,转载必须注明作者和本文链接
command
或者entrypoint
,其作用是启动该容器需要运行的东西(这是唯一的,你可以想象成,每个容器的作用就是运行一个命令),这个可以在Dockerfile
里面使用CMD
或者ENTRYPOINT
指定,两者功能差不多一样。Dockerfile
和你的docker-compose.yml
都没有指定CMD
或者entrypoint
,因此你的容器启动的时候会运行原始镜像的CMD
(可以在 node:lts-slim 看最后一行),也就是node
。这样的效果等同于,你在命令行输入node
。,其输出是
v12.16.2,作用等同于你在容器里面执行
node -v`。总结
Dockerfile
或者docker-compose.yml
需要指定CMD
或者ENTRYPOINT
,里面写你要该容器执行的命令,比如这样效果就等同于你在真机上运行
npm run dev
建议参考
占楼