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)
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)
归档时间: |
|
查看次数: |
13588 次 |
最近记录: |