Я неправильно использую Docker (развертывание приложения nodejs)? - PullRequest
1 голос
/ 01 мая 2019

Файл Docker (.dockerignore здесь не отображается, хотя он находится в том же каталоге):

FROM node:8 
WORKDIR /usr/src/myapplication
COPY package*.json ./
RUN npm install
RUN npm ci --only=production
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]

... где npm start должен выполнить tslint для устранения проблем с кодом, tsc для компиляции исходного кода TypeScript и, наконец, node в скомпилированном файле index.js, который раскручивает сервер express. Довольно стандартная конфигурация, но все же работает нормально.

Но мне кажется, что я неправильно использую Docker: почему я перемещаю еще не скомпилированный код и компилирую его позже, тогда как я мог скомпилировать его раньше? Более того, я должен держать:

  "dependencies": {
    "express": "^4.16.4",
    "typescript": "^3.4.5",
    "@types/express": "^4.16.1",
    "@types/node": "^11.13.8",
    "tslint": "^5.16.0"
  }

... эти зависимости как devDependencises, так и dependencies, и компилятор предупреждает меня об этом.

Я не парень из Докера, совсем нет, так есть ли лучший способ?

1 Ответ

2 голосов
/ 01 мая 2019

Существует действительно лучший способ! У Docker теперь есть способность, называемая «многоступенчатые изображения». С помощью этой возможности вы можете теперь скопировать весь проект в контекст сборки Docker, собрать проект, а затем «сбросить» образ контейнера, чтобы создать «готовый к запуску» производственный образ Docker.

Это имеет ряд преимуществ:

  1. Среда сборки может быть настроена для соответствия выполнению среда ... или нет вообще. Часто и мотиватор для особенность, во многих проектах требуется множество зависимостей для сборки. Тем не менее, в производстве очень мало, чтобы работать.
  2. Уменьшает развернутый образ докера. Не нужно иметь все эти dev-зависимости в развернутый образ.
  3. Удалена сложность в Dockerfile 'RUN установить пакет A', а затем 'RUN удалите пакет A ', как только приложение будет выполнено.

Вот лучшее место для начала работы с многоэтапными изображениями: https://docs.docker.com/develop/develop-images/multistage-build/

Надеюсь, это поможет! Дайте мне знать, как это получается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...