typescript - 无法将镜像部署到 kubernetes(打包结构问题)
问题描述
使用以下 dockerfile 成功构建后,我无法在 eks 上部署我的应用程序。
FROM node:12
# Create app directory
WORKDIR /usr/src/app
COPY udagram-feed/package*.json ./
RUN npm ci
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "npm", "run", "prod" ]
从集群中获取日志,这是我得到的:
internal/modules/cjs/loader.js:960
throw err;
^
Error: Cannot find module '/usr/src/app/www/server.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:957:15)
at Function.Module._load (internal/modules/cjs/loader.js:840:27)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
at internal/main/run_main_module.js:18:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! udagram-user@1.0.0 prod: `tsc && node ./www/server.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the udagram-user@1.0.0 prod script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2020-05-20T19_11_45_220Z-debug.log
在本地运行图像,我有以下文件结构:
- Dockerfile
- 节点模块
- 包.json
- 包-lock.json
- 源代码
src/ 目录包含 serve.ts sequelize.ts 和其他文件。显然没有 www/ 目录。为什么 Kubernetes 会在这个目录中寻找文件?任何帮助表示赞赏。这几天一直卡在这个问题上,不知道怎么办。文件结构见github repo Github
解决方案
首先,您的 Dockerfile 创建了一个 1GB 的映像。我修改它以创建一个 240MB 的图像。这个 Dockerfile 可以进一步优化;您可以在此处和此处参考有关创建多阶段 Dockerfile 的示例。:
FROM node:12-alpine
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN apk add --no-cache --virtual .gyp \
python \
make \
g++ \
&& npm ci \
&& apk del .gyp
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "npm", "run", "prod" ]
这是 docker 图像大小:
REPOSITORY TAG IMAGE ID CREATED SIZE
udagram-feed-alpine latest 185478b5eabc 11 seconds ago 247MB
udagram-feed latest fbf32e67d4fa 4 minutes ago 1.07GB
其次,您的package.json指的是./www/server.js
文件
推荐阅读
- python - 如何在 Python 中使用具有多个参数的 PowerShell 脚本文件运行 Azure CLI 运行命令调用?
- arrays - ReactJS - 如何将键值对添加到数组中?
- reactjs - 使用 Mount 时 Enzyme 返回的节点多于现有节点
- java - 使用 getParcelableExtra() 从不同的活动中获取价值
- c - 确定路径是否在目录内
- google-bigquery - 源的 dataset-id 中的变量
- php - 如何在 php 中使用上传和自定义文件名创建上传表单?
- eclipse - java.lang.NoClassDefFoundError 使用 Wildfly、Maven、Rest?
- jquery - 页面刷新后保留选择复选标记
- c# - 无法读取 Xamarin C# 目录中的文件