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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
  • Docker 容器启动的时候需要指定一个 command 或者 entrypoint,其作用是启动该容器需要运行的东西(这是唯一的,你可以想象成,每个容器的作用就是运行一个命令),这个可以在 Dockerfile 里面使用 CMD 或者 ENTRYPOINT 指定,两者功能差不多一样。
  • 你的 Dockerfile 和你的 docker-compose.yml 都没有指定 CMD 或者 entrypoint,因此你的容器启动的时候会运行原始镜像的 CMD(可以在 node:lts-slim 看最后一行),也就是 node。这样的效果等同于,你在命令行输入 node
    • 比如:``docker run --rm node:lts-slim -v,其输出是v12.16.2,作用等同于你在容器里面执行node -v`。

总结

  1. Dockerfile 或者 docker-compose.yml 需要指定 CMD 或者 ENTRYPOINT,里面写你要该容器执行的命令,比如
CMD ['npm', 'run', 'dev']

这样效果就等同于你在真机上运行 npm run dev

建议参考

  1. CMD
  2. ENTRYPOINT
4年前 评论
pigzzz (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!