需求

  1. 在nas的docker运行我的node项目
  2. 使用docker compose up -d来启动
  3. 首次运行时,它将先执行npm install,然后 npx prisma generate,最后是node --env-file=.env bin/www
  4. 非首次运行,则直接执行node --env-file=.env bin/www
  5. 出错时不立即退出,而是可以进入容器中
  6. 将代码每天从某台电脑同步到nas中
  7. docker能感应到代码的变化

对docker中运行的node项目debug

  • node --env-file=.env --inspect-brk=0.0.0.0 bin/www
  • 默认的端口号是"9229,记得publish端口- "9229:9229"
  • chrome://inspect/#devices 对 Target discovery settings进行设置:ip:92229

Promblem & Solution

Dockerfile + compose.yml

compose.yml示例:

services:
  server:
    build:
      context: .
      target: dev

定义了一个名为 server 的服务,并且指定了如何构建该服务的 Docker 镜像。

  • build 指令表明这个服务需要从当前目录(.)构建镜像,而不是从 Docker Hub 上拉取现成的镜像。
  • context: . 指示 docker-compose 使用当前目录作为构建上下文。这意味着 docker-compose 会将当前目录中的所有文件和目录传递给 Dockerfile。
  • target: dev 指示 docker-compose 使用 Dockerfile 中名为 dev 的构建阶段。Dockerfile 支持多阶段构建,每个阶段定义一个构建目标。使用 target 指令可以指定使用哪个构建阶段。

后面我放弃了这样的组合,因为Dockerfile写起来总是有些问题,我一时找不到解决方法。

更关键的是:我并不需要将构建好的镜像上传到其他地方。我在nas上使用docker,最主要的是为了docker所提供的纯净环境。

最后我的选择还是用compose.yml来做

compose.yml 示例

services:
  backend:
    container_name: backend-container
    image: node:20
    working_dir: /app
    volumes:
      - ./:/app
    # if you want to keep the container running and debug, you can use the following command
    #command: tail -f /dev/null
    # then use docker exec -it backend-container bash
    command: ["sh", "-c", "if [ ! -d 'node_modules' ]; then npm install && npx prisma generate; fi && node --env-file=.env bin/www"]
    ports:
      - "3000:3000"
      - "9229:9229"
    environment:
      - NODE_ENV=development
    restart: unless-stopped
    tty: true

参考