Node和docker - 如何处理babel或打字稿?

Jør*_*edt 20 babel node.js typescript docker gulp

我有一个节点应用程序,我想在Docker容器中托管,这应该是直截了当的,如本文所示:

https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

但是,在我的项目中,源不能直接运行,必须从ES6和/或Typescript编译.我使用gulp与babel,browserify和tsify一起构建 - 使用不同的浏览器和服务器设置.

在这种情况下,构建和自动化 docker镜像的最佳工作流程是什么?网络上是否有描述此类工作流程的资源?如若Dockerimage做建成后npm install,或者我应该创建一个shell脚本来完成这一切,简单的让Dockerfile收拾它一起?

如果Dockerfile应该进行构建 - 图像需要包含所有dev-dependencies,这是不理想的?

注意:我已经能够设置一个docker容器并运行它 - 但是这需要预先安装和构建所有文件.

ger*_*ome 11

一种可能的解决方案是将构建过程包装在特殊的docker镜像中.它通常被称为Builder图像.它应该包含所有构建依赖项:nodejs,npm,gulp,babel,tsc等.它封装了所有构建过程,无需在主机上安装这些工具.

首先运行构建器映像,将源代码目录作为卷安装.可以使用相同或单独的卷作为输出目录.第一个图像采用您的代码并运行所有构建命令.

作为第一步,您可以像现在一样将构建的代码打包到生产泊坞窗映像中.

以下是TypeScript的docker builder映像示例:https://hub.docker.com/r/sandrokeil/typescript/

可以为多个项目使用相同的docker构建器,因为它通常被设计为围绕一些常用工具的通用包装器.但建立自己的描述更复杂的程序是可以的.

关于构建器映像的好处是您的主机环境保持未受污染,您可以通过修改构建器映像的Dockerfile来自由地尝试更新版本的编译器/不同工具/更改顺序/执行任务.您可以随时使用构建过程回滚实验.


Luk*_*ger 11

我个人更喜欢在构建期间运行babel后删除dev依赖项:

FROM node:7

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Copy app source
COPY src /usr/src/app/src

# Compile app sources
RUN npm run compile

# Remove dev dependencies
RUN npm prune --production

# Expose port and CMD
EXPOSE 8080
CMD [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 WORKDIR 如果目录不存在,则创建该目录,因此不需要 mkdir (3认同)

Gre*_*reg 10

对于此类事情(从Docker 17.05开始),现代的建议是使用多阶段构建。这样,您可以在一个Dockerfile中使用所有dev / build依赖关系,但最终结果得到了优化,并且没有不必要的代码。

我对打字稿不是很熟悉,但这是一个使用yarn和babel的示例实现。使用此Dockerfile,我们可以构建一个开发映像(使用docker build --target development .)来在本地运行nodemon,测试等。但是通过直线,docker build .我们得到了一个精益,优化的生产图像,该图像使用pm2运行该应用程序。

# common base image for development and production
FROM node:10.11.0-alpine AS base
WORKDIR /app


# dev image contains everything needed for testing, development and building
FROM base AS development
COPY package.json yarn.lock ./

# first set aside prod dependencies so we can copy in to the prod image
RUN yarn install --pure-lockfile --production
RUN cp -R node_modules /tmp/node_modules

# install all dependencies and add source code
RUN yarn install --pure-lockfile
COPY . .


# builder runs unit tests and linter, then builds production code 
FROM development as builder
RUN yarn lint
RUN yarn test:unit --colors
RUN yarn babel ./src --out-dir ./dist --copy-files


# release includes bare minimum required to run the app, copied from builder
FROM base AS release
COPY --from=builder /tmp/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json ./
CMD ["yarn", "pm2-runtime", "dist/index.js"]
Run Code Online (Sandbox Code Playgroud)


小智 5

跟着这些步骤:

第1步:确保您的依赖关系中的 babel依赖关系不是对package.json的dev依赖关系.还要添加从node_modules文件夹引用babel的部署脚本.你将从docker中调用这个脚本这就是我的package.json文件的样子

{
  "name": "tmeasy_api",
  "version": "1.0.0",
  "description": "Trade made easy Application",
  "main": "build/index.js",
  "scripts": {    
     "build": "babel -w src/ -d build/ -s inline",
    "deploy" : "node_modules/babel-cli/bin/babel.js src/ -d build/",
  },
  "devDependencies": {   
    "nodemon": "^1.9.2"
  },
  "dependencies": {    
    "babel-cli": "^6.10.1",
    "babel-polyfill": "^6.9.1",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-stage-0": "^6.5.0",
    "babel-preset-stage-3": "^6.22.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

build用于您在本地计算机上的开发目的,并且可以从dockerfile中调用deploy.

第2步:因为我们想要自己进行babael转换,所以请确保将.dockerignore添加到您在开发期间使用的构建文件夹中.这就是我的.dockerignore文件的样子.

    build
    node_modules    
Run Code Online (Sandbox Code Playgroud)

步骤3.构建dockerfile.下面是我的docker文件的示例

FROM node:6

MAINTAINER stackoverflow

ENV NODE_ENV=production
ENV PORT=3000

# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:

ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /var/www && cp -a /tmp/node_modules /var/www

# copy current working directory into docker; but it first checks for  
# .dockerignore so build will not be included.

COPY      . /var/www/
WORKDIR   /var/www/

# remove any previous builds and create a new build folder and then
# call our node script deploy

RUN rm -f build
RUN mkdir build
RUN chmod 777 /var/www/build
RUN npm run deploy

VOLUME    /var/www/uploads
EXPOSE $PORT


ENTRYPOINT ["node","build/index.js"]
Run Code Online (Sandbox Code Playgroud)