node.js - Node + Docker撰写: Development and production setup

标签 node.js docker docker-compose development-environment production-environment

我正在寻找一种在我的项目中使用docker,docker-compose和nodejs同时拥有开发生产环境的解决方案。

我该如何处理?

基本上,我想要的是一个用于启动docker生产环境的命令和一个用于启动我的开发环境命令(例如,可以使用nodemon)。

这是我的Dockerfile

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

CMD ["npm", "run", "prod"] # <--- Have a possibility to run something like "npm run dev" here instead

docker-compose.yml
version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

package.json
// ...
    "scripts": {
        "build": "tsc",
        "dev": "nodemon source/index.ts",
        "prod": "node build/index.js"
    },
// ...

最佳答案

您可以使用入口点并将命令传递给docker容器。然后,您可以使用docker-compose inharitance启动所需环境的compose并将命令附加到入口点。

Dockerfile :

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

ENTRYPOINT ["npm", "run"]

主要 docker-compose.yml :
version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

然后有两个docker-compose文件将传递的命令附加到镜像入口点。开发- docker-compose.dev.yml :
version: "3"
services:
    findus:
        command: dev

docker-compose.prod.yml :
version: "3"
services:
    findus:
        command: prod

然后启动开发环境:
docker-compose  -f docker-compose.yml -f docker-compose.dev.yml up    

对于产品环境:
docker-compose  -f docker-compose.yml -f docker-compose.prod.yml up   

因此,command将被追加到ENTRYPOINT指令中。

如果您想将命令作为环境变量传递,那么这种方法也可以与环境变量一起使用。您可以在docs中找到更多信息。

关于node.js - Node + Docker撰写: Development and production setup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62122006/

相关文章:

Docker 运行与拉取

heroku - `container:init` 不是 heroku 命令

docker - 用户尝试在unix:///var/run/docker.sock上连接到Docker守护程序套接字时拒绝了权限

docker - 从手动Docker主机网络传递到Docker Compose桥

node.js - Mongoose 中的嵌套数组

node.js - 有没有一种方法可以在一行中替换 HTML 文件中的多个出现位置?

node.js - Sinon:强制回调调用

node.js - 当 res.flush() 不起作用时,如何刷新到事件流? ( Node .js)

php - Docker和php “standard_init_linux.go:207: exec user process caused ” exec格式错误”。入口点也无法读取exec的参数

docker - Docker 上的 RedisInsight 和 Docker 上的 Redis : Could not connect: Error 99 connecting to localhost:6379. 无法分配请求的地址