在容器中部署angular应用程序无法运行ng命令
我试图在docker容器中使用google cloud运行我的angular应用程序。我尝试了一些不同的dockerfile方法,但我还没有成功地让我的应用程序运行在容器中部署angular应用程序无法运行ng命令,angular,docker,Angular,Docker,我试图在docker容器中使用google cloud运行我的angular应用程序。我尝试了一些不同的dockerfile方法,但我还没有成功地让我的应用程序运行 FROM node:10-alpine as build-step RUN mkdir -p /app WORKDIR /app COPY package.json /app RUN npm install RUN npm install -g @angular/cli COPY . /app RUN npm run build
FROM node:10-alpine as build-step
RUN mkdir -p /app
WORKDIR /app
COPY package.json /app
RUN npm install
RUN npm install -g @angular/cli
COPY . /app
RUN npm run build --prod
# Stage 2
FROM nginx:1-alpine
COPY --from=build-step /app/ /usr/share/nginx/html
这种方法似乎可以正确地构建它,但它无法启动容器,过了一段时间它就超时了。“serve命令需要在Angular项目中运行,但找不到项目定义。”这对我来说似乎很奇怪,因为我确实在容器中安装了Angular/cli。"
然后我提出了自己更简单的方法:
FROM node:12.19.0
WORKDIR /
COPY package*.json ./
RUN npm install
RUN npm install -g @angular/cli
COPY . .
CMD npm start
此操作失败,错误为“错误:(gcloud.run.services.update)云运行错误:容器启动失败。无法在端口环境变量定义的端口上启动并侦听。此修订版的日志可能包含更多信息。”
我对google cloud run和docker container都是新手,所以我想这可能是我在这里错过的非常简单和明显的东西
谢谢
编辑
package.json
{
"name": "LunchTime",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"start-proxy": " --proxy-config proxy.conf.json",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular-devkit/schematics": "^10.1.7",
"@angular/animations": "^10.1.6",
"@angular/common": "^10.1.6",
"@angular/compiler": "^10.1.6",
"@angular/core": "^10.1.6",
"@angular/forms": "^10.1.6",
"@angular/localize": "^10.1.6",
"@angular/platform-browser": "^10.1.6",
"@angular/platform-browser-dynamic": "^10.1.6",
"@angular/router": "^10.1.6",
"@nativescript/angular": "^10.1.7",
"@ng-bootstrap/ng-bootstrap": "^7.0.0",
"bootstrap": "^4.5.3",
"core-js": "^2.6.11",
"masonry-layout": "^4.2.2",
"moment": "^2.29.1",
"ngx-bootstrap": "^6.1.0",
"ngx-masonry": "^10.0.6",
"node": "^14.14.0",
"rxjs": "^6.6.3",
"sweetalert2": "^10.6.1",
"tslib": "^1.14.1",
"zone.js": "^0.10.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.1001.7",
"@angular/cli": "^10.1.7",
"@angular/compiler-cli": "^10.1.6",
"@angular/language-service": "^10.1.6",
"@nativescript/schematics": "^10.1.0",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "^2.0.8",
"@types/node": "^6.14.13",
"codelyzer": "~3.2.0",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "^3.1.4",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.4.3",
"karma-jasmine": "^1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "^5.4.4",
"ts-node": "~3.2.0",
"tslint": "~5.7.0",
"typescript": "~4.0.3"
}
}
我不认为这是一个与谷歌云相关的问题 您说映像是构建的,但运行时错误很奇怪,因为从Nginx的角度来看,它不知道它所服务的文件来自Angular。因此,首先,我要检查映像是否确实正确创建。换句话说,由于您达到第2阶段,Angular不再存在
关于端口环境变量的第二个错误可能是其他人已经在侦听该端口。我可能在您的第一个
Dockerfile
中发现了您的问题。您将Workdir设置为/app
,然后将所有文件(package.json
和
)复制到/app
COPY
是相对于WORKDIR
的,因此您的最终路径将是/app/app/
。也许您没有意识到这一点?因为在您的包.json
中,您没有将目录更改为/app
。请检查此项:
与docker一起使用angular的其他注意事项
- 对于自动化环境,如测试平台、持续集成和部署,请使用
而不是npm ci
。有关原因和方式的更多信息npm install
- 我不知道您是否需要
。仅对于Docker start,您不需要此功能。也许您可以尝试一下并给我一些反馈。:)单独运行npm install-g@angular/cli
- 如果您需要
您不需要WORKDIR
。WORKDIR会自动执行运行mkdir-p/app
FROM node:10-alpine as build-step
WORKDIR /app
COPY package.json .
RUN npm ci
COPY . .
RUN npm run build --prod
# Stage 2
FROM nginx:1-alpine
COPY --from=build-step /app/ /usr/share/nginx/html
编辑:删除了
运行mkdir-p/app
。原因请参见注释。嗨!你能分享你的软件包吗?json
请?当然可以@nclskfm!谢谢你的帮助:)在你的初始Dockerfile中,它不应该在容器启动时运行ng
命令;它会从CMD
de>nginximage您正在从中启动并使用捆绑的内置应用程序启动nginx。如何启动容器?步骤4/8:运行在68a66917e56d npm ERR中运行的npm ci-->!cipm只能安装带有现有包的包-lock.json或带有lockfileVersion>=1的npm-shrinkwrap.json。使用运行安装npm@5或以后生成它,然后再试一次。我确实有一个package-lock.json。我需要更新我的节点版本吗?我改为运行npm I,因为它工作了,然后它生成了,但我在最后一步超时。“步骤2—“部署”:状态:为gcr.io/google.com/cloudsdktool/cloud sdk下载了更新的图像:最新步骤2—“部署”:gcr.io/google.com/cloudsdktool/cloud sdk:最新超时错误:超出上下文截止日期“嗯,我不熟悉谷歌云。Dockerfile
现在是否可以在本地工作?COPY
的右侧遵循正常的Unix路径规则:像/app
这样的绝对路径是映像内的绝对路径,像
这样的相对路径是相对于当前的WORKDIR
进行解释的。