노드 및 도커 - 바벨 또는 형식 제작을 처리하는 방법
이 기사에서 볼 수 있듯이, 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
매번 재시험을 치르다가
그게 도움이 되길 바라 :) 질문이 있으면 나에게 알려줘!
현재 워크플로우를 사용하여 다음 작업을 수행 중:
npm install
그리고tsd install
지방적으로gulp
국부적으로 건설하다- Dockerfile에서 타이핑/node_modules가 아닌 모든 프로그램 파일을 Docker 이미지에 복사하십시오.
-
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가 포함되어야 하며, 어떤 것이 이상적이지 않은가?
사정에 따라 다르겠지.바로 사용할 수 있는 이미지를 제공하려면 웹 앱이 실행하는 데 필요한 모든 것을 포함해야 한다.한 가지 장점은 나중에 컨테이너를 시작하고 매개변수를 전달하면 바로 출발할 수 있다는 것이다.
개발 단계에서는 일반적으로 미리 정의된 개발 환경 때문에 이 이미지가 실제로 필요하지 않다.매번 변경 후에 이러한 이미지를 생성하면 시간과 자원이 소요된다.
제안된 접근 방식: 나는 양방향 설정을 제안한다.
- 개발 중:고정된 환경을 사용하여 앱을 개발하십시오.모든 소프트웨어는 로컬 또는 도커/VM 내부에서 실행할 수 있다.개발 설정과 함께 도커 컨테이너를 사용할 것을 제안한다. 특히 팀 내에서 일하고 모든 사람이 동일한 개발 베이스를 가질 필요가 있다면 더욱 그러하다.
- 웹 앱 배포: (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
'Programing' 카테고리의 다른 글
vuejs/vue.js에서 만족스러운 진정한 div 내부 스팬 태그에서 키프레스 이벤트를 호출하는 방법? (0) | 2022.04.06 |
---|---|
라우터 서버 측면 렌더링 오류 대응: 경고: propType 실패: 필수 prop 'history'가 'RoutingContext'에 지정되지 않음 (0) | 2022.04.06 |
라우터 v5로 대응 오류: 개체가 반응 하위 개체로 유효하지 않음(찾은 항목: 키가 {child}인 개체) (0) | 2022.04.06 |
슈퍼 컴포넌트의 상태가 변경되었을 때 라우터 내부에 있는 컴포넌트의 재렌딩을 방지하는 방법? (0) | 2022.04.06 |
Vue.JS - 기본 레이아웃 구성 요소 및 라우팅 (0) | 2022.04.06 |