publish dotnet core angular spa app to docker
公司一个使用Angular开发的应用准备下个版本使用.Net Core开发后台, 刚好可以用到.Net Core Angular Spa模板, 而且最近也在学习Docker, 于是就想把它融汇贯通, 之前往Docker上部署过.Net Core MVC的应用, 那个比较简单, 使用微软官方文档的示例即可.
于是在使用.Net Core Angular Spa的时候, 我依葫芦画瓢发现这是走不通的, 因为Angular应用在构建的时候除了依赖.Net Core SDK还依赖于Node, 直接使用原来的Dockerfile作为模板行不通.
在原来的木板上需要加上安装Node的命令:
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
整个完整示例如下:
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
WORKDIR /app
COPY src/. ./src/
WORKDIR /app/src/WebApp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/src/WebApp/out ./
EXPOSE 5000
ENTRYPOINT ["dotnet", "WebApp.dll"]
上面的示例也是我总结出来的, 我实际的操作其实是这样的:
因为在家网络环境有那么点你懂的, 每次一到这一句‘RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -’就会卡在他的第五个小步骤, 我也猜到了是网络问题, 来来回回倒腾了好几次依然卡在那里. 因为已经凌晨了, 想想, 这么做无用功不行啊, 于是我去睡觉(失眠了)了, 折腾了半天睡不着索性爬起来敲代码, 这次我换了条思路, 我不纠结于Dockerfile了, 我要做一个镜像:
微软倒是有build专用的镜像: microsoft/aspnetcore-build, 她同时包含了以下几个环境:
- Node.js
- NET Core SDK
- Bower
- Gulp
呵呵, 不幸的是, 他的SDK的版本是2.2的, 不支持3.0.
那我就在SDK3.0的基础上装一个Node:
- 首先创建一个SDK容器然后进入容器:
docker run -it mcr.microsoft.com/dotnet/core/sdk:3.0 /bin/bash
这里我专门测试了该容器能不能支持yum或者apt-get:
yum -v
apt-get -v
测试的结果是支持apt-get而不支持yum, 因此我猜测微软的SDK镜像是基于Ubuntu构建的(当然这里只是猜测).
- 然后安装Node:
curl -sL https://deb.nodesource.com/setup_12.x | bash -
apt-get install -y nodejs
node -v
npm -v
很神奇, 这次安装特别顺利, 按道理网络不过不通, 那这里也应该会卡住啊, 可能是上天眷顾想让我早点睡觉吧!
制作了镜像放在本地那天弄丢了咋办, 于是我就想着上传到Docker Hub上去, 还能供需要的朋友使用.
# 首先退出容器
exit
# 然后把容器使用commit命生成镜像
docker commit -a "jerryqi" -m "dotnet core build image which contains dotnet core 3.0 and node 12.13" d78d728c6d46 dotnet-build:1.0
生成镜像的命令这里做一个说明:
- -a: 作者
- -m: 描述
- d78d728c6d46: 容器Id
- dotnet-build:1.0: 生成的镜像名和tag
然后使用docker login命令登陆Docker Hub, 当然前提是你已经注册了账号.
然后就可以push到Docker Hub了:
docker push dotnet-build:1.0
你已经这样就完事了吗? 并没有, 报错了:
denied: requested access to the resource is denied
查其原因, 是因为这样直接推送是推送到了官方名下镜像(这是我个人的一个描述), 很明显我这里是个人的镜像只能是在我个人的名下.
打个比方, 哪天官方或者其他人也Push一个名字为dotnet-build:1.0的镜像那岂不混乱了.
所以这个镜像必须在我的名下, 那么就需要给他打一个tag:
docker tag dotnet-build:1.0 jerryqi/dotnet-build:1.0
那么现在推送就OK了:
docker push jerryqi/dotnet-build:1.0
上面走了不少弯路, 而实际上不用这么麻烦的, 直接在生成镜像的时候就可以把上面的全给干了:
# 镜像名直接加上你的用户名:jerryqi/dotnet-build:1.0
docker commit -a "jerryqi" -m "dotnet core build image which contains dotnet core 3.0 and node 12.13" d78d728c6d46 jerryqi/dotnet-build:1.0
这样我就可以简化我的Dockerfile如下了:
FROM jerryqi/dotnet-build:1.0 AS build
WORKDIR /app
COPY src/. ./src/
WORKDIR /app/src/WebApp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/src/WebApp/out ./
EXPOSE 5000
ENTRYPOINT ["dotnet", "WebApp.dll"]
终于总结好了, 我该去吃午饭了!
publish dotnet core angular spa app to docker的更多相关文章
- dotnet core webapi 发布部署到docker的步骤
1. 创建web api项目,编译并测试成功 2. 在项目的根目录添加Dockerfile文件,注意:Dockerfile文件名区分大小写 文件内容如下 # 基于microsoft/dotnet:la ...
- .NET Core Web 应用部署到 Docker 中运行
环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...
- docker for windows & dotnet core app
Step 1: 安装docker for windows Step 2: 从github 上 clone 源代码:https://github.com/dotnet/dotnet-docker-sam ...
- Docker 部署Dotnet Core MVC项目
原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...
- 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上
1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...
- 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像
Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...
- jenkins publish .net core application to linux server in docker
上一个Demo进行了单独的Jenkins远程部署, 本Demo将使用流行的Jenkins+Git+Docker进行持续部署. 准备Linux服务器 和上一篇Demo一样, 在Azure创建一台Cent ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- 【Step By Step】将Dotnet Core部署到Docker上
本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会). 一.在Docker中运行Dot ...
随机推荐
- 三层交换+DHCP实验详解
- ICEM-点火器
原视频下载地址:https://pan.baidu.com/s/1hrU75So 密码: k6nc
- Ubuntu不能连接网络
我的问题是在选择桥接模式下的界面名称选择错误,在windows中我的Intel7260显示未连接,所以更改为Controller之后好用了,折磨了我大半天.
- ssm 项目记录用户操作日志和异常日志
借助网上参考的内容,写出自己记录操作日志的心得!! 我用的是ssm项目使用aop记录日志:这里用到了aop的切点 和 自定义注解方式: 1.建好数据表: 数据库记录的字段有: 日志id .操作人.操作 ...
- 用样式表美化QTabwidget外观
没有仔细看是否正确,先保存到这里,以后研究一下 一.参考文章:http://bbs.csdn.net/topics/390632657?page=1 setStyleSheet("QTabW ...
- 【转】利用Python将多个PDF合并为一个
本脚本用来合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签 使用示例如下: python pdfmerge.py -p "D:\pdf-files" -o " ...
- java.lang.UnsupportedClassVersionError: com/mysql/cj/jdbc/Driver : Unsupported major.minor version 52.0 (unable to load class [com.mysql.cj.jdbc.Driver])
原因: com/mysql/cj/jdbc/Driver是6.0版本的驱动,兼容JDK8环境,不兼容JDK7环境,在基于jdk7的tomcat中编译运行会出错,在基于jdk8的tomcat中编译运行则 ...
- JVM 线程上下文类加载器
当前类加载器(Current ClassLoader) 每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(指所依赖的类) 如果ClassX引用了ClassY,那么ClassX的类加载 ...
- H.264与H.265视频压缩编码参考码率
- [转]eclipse常用设置
原文:https://www.cnblogs.com/wangmingshun/p/5675857.html Eclipse重新设置workspace Window—>Preferences—& ...