需求
- 在nas的docker运行我的node项目
- 使用
docker compose up -d
来启动 - 首次运行时,它将先执行
npm install
,然后npx prisma generate
,最后是node --env-file=.env bin/www
- 非首次运行,则直接执行
node --env-file=.env bin/www
- 出错时不立即退出,而是可以进入容器中
- 将代码每天从某台电脑同步到nas中
- 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
- node.js - Bus Error when running npm run dev || npm start - Stack Overflow
- node.js - bcrypt invalid elf header when running node app - Stack Overflow
- Docker Compose - How to execute multiple commands? - Stack Overflow
- ubuntu 16.04 - pull access denied repository does not exist or may require docker login - Stack Overflow
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
参考
- node - Official Image | Docker Hub
- Node.js — Debugging Node.js
- Compose Build Specification | Docker Docs
- Containerize a Node.js application | Docker Docs
- node.js - Bus Error when running npm run dev || npm start - Stack Overflow
- node.js - bcrypt invalid elf header when running node app - Stack Overflow
- Docker Compose - How to execute multiple commands? - Stack Overflow
- ubuntu 16.04 - pull access denied repository does not exist or may require docker login - Stack Overflow