Programing

노드 및 도커 - 바벨 또는 형식 제작을 처리하는 방법

c10106 2022. 4. 6. 22:18
반응형

노드 및 도커 - 바벨 또는 형식 제작을 처리하는 방법

이 기사에서 볼 수 있듯이, Docker 컨테이너에서 호스팅할 노드 애플리케이션이 있다.

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

그러나 내 프로젝트에서는 소스를 직접 실행할 수 없으므로 ES6 및/또는 Typecript에서 컴파일해야 한다.나는 브라우저와 서버를 위한 다른 설정을 가진 바벨, 브라우저, tsify로 만들기 위해 꿀벌을 사용한다.

이 경우 도커 이미지를 만들고 자동화하는 데 가장 적합한 워크플로우는 무엇인가?이러한 워크플로를 설명하는 리소스가 웹에 있는가?Dockerimage가 다음 이후에 건물을 수행할 것인가?npm install아니면 이 모든 것을 하기 위해 셸 스크립트를 만들어서 Dockerfile이 이 모든 것을 함께 포장하도록 해야 하는가?

도커 파일이 빌드를 수행해야 하는 경우 이미지에는 모든 dev-dependency가 포함되어야 하며, 어떤 것이 이상적이지 않은가?

참고: 나는 도커 컨테이너를 설치하고 실행할 수 있었지만, 이것은 사전에 모든 파일을 설치하고 빌드해야 했다.

(도커 17.05 기준) 이러한 종류의 것에 대한 현대적인 권고는 다단계 빌드를 사용하는 것이다.이렇게 하면 하나의 도커 파일에 있는 개발/구축 종속성을 모두 사용할 수 있지만 최종 결과가 최적화되고 불필요한 코드가 발생하지 않는다.

나는 활자체에는 그다지 익숙하지 않지만, 여기에 실과 바벨을 이용한 구현의 예가 있다.이 Docker 파일을 사용하여 개발 이미지를 작성할 수 있다(프로토콜 사용).docker build --target development .로컬로 실행 노데몬, 테스트 등을 위한 (직선으로)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"]

한 가지 가능한 해결책은 빌드 절차를 특수 도커 이미지로 포장하는 것이다.그것은 종종 Builder 이미지라고 불린다.여기에는 노드j, npm, 꿀꺽, 바벨, tsc 등 모든 빌드 의존성이 포함되어야 한다.모든 빌드 프로세스를 캡슐화하여 호스트에 이러한 도구를 설치할 필요가 없음

먼저 소스 코드 디렉토리를 볼륨으로 마운트하여 빌더 이미지를 실행하십시오.동일하거나 별도의 볼륨을 출력 디렉토리로 사용할 수 있다.첫 번째 이미지는 코드를 가져가고 모든 빌드 명령을 실행한다.

첫 번째 단계로, 당신은 당신이 만든 코드를 지금과 같이 생산 도커 이미지로 포장한다.

다음은 TypeScript에 대한 Docker Builder 이미지의 예: https://hub.docker.com/r/sandrokeil/typescript/

일반적으로 몇 가지 일반적인 도구를 감싸도록 설계되었기 때문에 여러 프로젝트에 대해 동일한 도커 작성기를 사용해도 괜찮다.하지만 좀 더 복잡한 절차를 설명하는 당신만의 것을 만드는 것은 괜찮다.

빌더 이미지의 좋은 점은 호스트 환경이 오염되지 않은 상태로 유지되고 빌더 이미지의 Docker 파일을 수정하는 것만으로 새로운 버전의 컴파일러/다른 도구/변경 순서/실행 작업을 동시에 시도할 수 있다는 것이다.언제든지 빌드 프로시저로 실험을 롤백할 수 있다.

개인적으로 빌드 중에 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" ]

다음 단계를 수행하십시오.

1단계: babel 종속성이 package.json의 종속성이 아닌 종속성 내부에 있는지 확인하십시오.node_modules 폴더에서 babel을 참조하는 배포 스크립트도 추가하십시오.이 대본은 부두 안쪽에서 부르면 돼 내 소포야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"
  }
}

빌드는 당신의 로컬 컴퓨터에서 당신의 개발 목적을 위한 것이며, 당신의 도커파일 안에서 배포가 호출되어야 한다.

2단계: 우리가 바바엘 변환을 직접 수행하기를 원하므로 개발 중에 사용하고 있는 빌드 폴더에 .dockerignore를 추가하십시오.내 .dockerignore 파일은 이렇게 생겼어.

    build
    node_modules    

3단계. 도커 파일을 작성하십시오. 아래는 내 도커 파일의 샘플입니다.

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"]

방금 Docker를 이용한 Typecript와 Node.js의 훌륭한 시드 앱을 출시했어.

GitHub에서 찾을 수 있다.

이 프로젝트에서는 Dockerfile이 사용하는 모든 명령을 설명하고 이를 결합하여tsc와 함께gulp일부 부가적인 이익을 위해

repo를 체크아웃하지 않으려면 다음 사항을 참조하십시오.

도커파일

FROM node:8

ENV USER=app

ENV SUBDIR=appDir

RUN useradd --user-group --create-home --shell /bin/false $USER &&\
    npm install --global tsc-watch npm ntypescript typescript gulp-cli

ENV HOME=/home/$USER

COPY package.json gulpfile.js $HOME/$SUBDIR/

RUN chown -R $USER:$USER $HOME/*

USER $USER

WORKDIR $HOME/$SUBDIR

RUN npm install

CMD ["node", "dist/index.js"]

docker-present.yml

version: '3.1'

services:
  app:
    build: .
    command: npm run build
    environment:
      NODE_ENV: development
    ports:
      - '3000:3000'
    volumes:
      - .:/home/app/appDir
      - /home/app/appDir/node_modules

꾸러미json

{
  "name": "docker-node-typescript",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "build": "gulp copy; gulp watch & tsc-watch -p . --onSuccess \"node dist/index.js\"",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "Stephen Gardner (opensourceaugie@gmail.com)",
  "license": "ISC",
  "dependencies": {
    "express": "^4.10.2",
    "gulp": "^3.9.1",
    "socket.io": "^1.2.0"
  },
  "devDependencies": {
    "@types/express": "^4.11.0",
    "@types/node": "^8.5.8"
  }
}

tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/",
    "sourceMap": true,
    "declaration": false,
    "module": "commonjs",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "ES6"
  },
  "include": [
    "**/*.ts"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

질문의 해답을 더 찾기 위해, ts는 처음부터 편집되고 있다.docker-compose.yml이 의장을 npm run build그 다음엔 이렇게 부른다.tsc.tsc그리고 나서 우리의 파일을 에 복사한다.dist폴더와 간단한 것node dist/index.js명령에서 이 파일을 실행한다.우리는 노데몬을 사용하는 대신에tsc-watch그리고gulp.watch앱과 화재의 변화를 주시하다node dist/index.js매번 재시험을 치르다가

그게 도움이 되길 바라 :) 질문이 있으면 나에게 알려줘!

현재 워크플로우를 사용하여 다음 작업을 수행 중:

  1. npm install그리고tsd install지방적으로
  2. gulp국부적으로 건설하다
  3. Dockerfile에서 타이핑/node_modules가 아닌 모든 프로그램 파일을 Docker 이미지에 복사하십시오.
  4. npm install --production

이렇게 하면 이미지에서 원하는 파일만 얻을 수 있지만, 도커 파일이 직접 빌드를 할 수 있다면 더 좋을 것이다.

도커 파일:

FROM node:5.1

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

# Bundle app
COPY package.json index.js /usr/src/app/
COPY views/ /usr/src/app/views/
COPY build/ /usr/src/app/build/
COPY public/ /usr/src/app/public/

# Install app dependencies
RUN npm install --production --silent

EXPOSE 3000
CMD [ "node", "index.js" ]

다시 설치하기 전에 Dockerimage 스크립트를 작성한 다음 원하지 않는 파일을 삭제하면 "이미징 프로세스"의 완전한 자동화가 설정될 수 있을 것 같다.

그러나 내 프로젝트에서는 소스를 직접 실행할 수 없으므로 ES6 및/또는 Typecript에서 컴파일해야 한다.나는 브라우저와 서버를 위한 다른 설정을 가진 바벨, 브라우저, tsify로 만들기 위해 꿀벌을 사용한다.이 경우 도커 이미지를 만들고 자동화하는 데 가장 적합한 워크플로우는 무엇인가?

내가 올바르게 이해했을 때, 당신은 당신의 웹 앱을 도커 컨테이너 안에 배치하고 다른 대상 환경에 다른 맛을 제공하기를 원한다 (다른 브라우저와 서버를 언급하셨습니다.) (1)

도커 파일이 빌드를 수행해야 하는 경우 이미지에는 모든 dev-dependency가 포함되어야 하며, 어떤 것이 이상적이지 않은가?

사정에 따라 다르겠지.바로 사용할 수 있는 이미지를 제공하려면 웹 앱이 실행하는 데 필요한 모든 것을 포함해야 한다.한 가지 장점은 나중에 컨테이너를 시작하고 매개변수를 전달하면 바로 출발할 수 있다는 것이다.

개발 단계에서는 일반적으로 미리 정의된 개발 환경 때문에 이 이미지가 실제로 필요하지 않다.매번 변경 후에 이러한 이미지를 생성하면 시간과 자원이 소요된다.

제안된 접근 방식: 나는 양방향 설정을 제안한다.

  1. 개발 중:고정된 환경을 사용하여 앱을 개발하십시오.모든 소프트웨어는 로컬 또는 도커/VM 내부에서 실행할 수 있다.개발 설정과 함께 도커 컨테이너를 사용할 것을 제안한다. 특히 팀 내에서 일하고 모든 사람이 동일한 개발 베이스를 가질 필요가 있다면 더욱 그러하다.
  2. 배포: (1) 이해한 바와 같이, 다른 환경에 앱을 배포하려면 다른 구성을 생성/제공해야 한다.그런 것을 실현하기 위해서, 당신은 당신의 앱을 다른 도커 용기에 포장하는 셸 스크립트로 시작할 수 있다.배포 전에 스크립트를 실행하십시오.지킬을 실행하면 모든 테스트가 잘 실행된 후에 각 커밋 후에 쉘 스크립트를 호출한다.

개발 및 배포 단계용 도커 컨테이너:나는 나의 프로젝트와 동료인 https://github.com/k00ni/Docker-Nodejs-environment를 참고하고 싶다.

이 도커는 다음을 유지함으로써 전체 개발 및 배치 환경을 제공한다.

  • 노드.js
  • NPM
  • 꿀꺽
  • Babel(파일 변경 시 ECMA6에서 JavaScript로 자동 전송)
  • 웹팩

도커 컨테이너 내부에 있는 다른 JavaScript 도우미.도커 컨테이너 내부의 볼륨을 통해 프로젝트 폴더를 연결하십시오.환경을 초기화하고(예: package.json의 모든 종속성을 배포함) 바로 가십시오.

귀하와 귀하의 팀이 동일한 환경(Node.js 버전, NPM 버전...)을 사용할 수 있도록 개발 목적으로 사용할 수 있는 또 다른 이점은 파일 변경으로 인해 ECMA6/RecactJS/... 파일이 JavaScript 파일로 다시 컴파일(각 변경 후 손으로 이 작업을 수행할 필요 없음)된다는 것이다.우리는 그것을 위해 바벨을 사용한다.

배포를 위해 이 도커 이미지를 확장하고 필요한 부품을 변경하십시오.컨테이너 안쪽에 앱을 연결하지 않고 Git(또는 비슷한 것)을 통해 끌어다 놓을 수 있다.당신은 모든 일에 같은 지하실을 사용할 것이다.

개발 단계와 생산 단계에서 모두 안내해야 할 이 기사를 찾았다: https://www.sentinelstand.com/article/docker-with-node-in-development-and-production

이 기사에서는 Node/Express 앱에 대한 프로덕션 도커 이미지를 생성해 보십시오.또한 Docker Composer를 사용하여 개발 프로세스에 Docker를 추가하여 노드 애플리케이션 자체를 포함한 서비스를 로컬 머신에서 분리 및 재현 가능한 방식으로 쉽게 스핀업할 수 있도록 할 것이다.

이 앱은 새로운 자바스크립트 구문을 사용하여 Babel이 빌드 프로세스에 어떻게 포함될 수 있는지를 보여줄 것이다.현재 노드 버전은 ECMAScript 모듈(가져오기 및 내보내기)과 같은 특정 현대 JavaScript 기능을 지원하지 않을 수 있으므로 Babel은 코드를 역호환 버전으로 변환하는 데 사용될 것이다.

참조URL: https://stackoverflow.com/questions/37406616/node-and-docker-how-to-handle-babel-or-typescript-build

반응형