公司一个使用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的更多相关文章

  1. dotnet core webapi 发布部署到docker的步骤

    1. 创建web api项目,编译并测试成功 2. 在项目的根目录添加Dockerfile文件,注意:Dockerfile文件名区分大小写 文件内容如下 # 基于microsoft/dotnet:la ...

  2. .NET Core Web 应用部署到 Docker 中运行

    环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...

  3. docker for windows & dotnet core app

    Step 1: 安装docker for windows Step 2: 从github 上 clone 源代码:https://github.com/dotnet/dotnet-docker-sam ...

  4. Docker 部署Dotnet Core MVC项目

    原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...

  5. 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上

    1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...

  6. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  7. jenkins publish .net core application to linux server in docker

    上一个Demo进行了单独的Jenkins远程部署, 本Demo将使用流行的Jenkins+Git+Docker进行持续部署. 准备Linux服务器 和上一篇Demo一样, 在Azure创建一台Cent ...

  8. dotnet core调试docker下生成的dump文件

    最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...

  9. 【Step By Step】将Dotnet Core部署到Docker上

    本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会). 一.在Docker中运行Dot ...

随机推荐

  1. vue列表拖拽排序功能实现

    1.实现目标:目标是输入一个数组,生成一个列表:通过拖拽排序,拖拽结束后输出一个经过排序的数组. 2.实现思路: 2.1是使用HTML5的drag功能来实现,每次拖拽时直接操作Dom节点排序,拖拽结束 ...

  2. [代码审计]php弱类型总结

    0x01 前言 php是世界上最好的语言,所以php自身的安全问题也是web安全的一个方面.由于其自身弱类型语言的特性以及内置函数对于传入参数的松散处理,所以会带来很多的问题,这里将进行简要介绍. 弱 ...

  3. Oracle语法 及 SQL题目(二)

    目录 课例复制 思考题四 解题思路 思考题五 解题思路 课例复制 思考题四 最近,经过你的努力,你得到了一份工作,成为了百货公司的一位经理. 到位后,你发现你的销售数据库中有两张表,一个是商店促销时间 ...

  4. Java 面向对象(十六)

    多线程 一.并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行, ...

  5. python 生成 pyc 文件

    以 pyc 为扩展名的是Python的编译文件.其执行速度快于 py 文件且不能用文本编辑编辑查看.所以 pyc 文件往往代替 py 文件发布. Python 在执行时,首先会将 py 文件中的源代码 ...

  6. win7 激活码 秘钥

    019.06最新windows7旗舰版系统激活码: 目前市面上的win7旗舰版激活码大部分都已经过期或失效了,下面来分享一些最新的. win7旗舰版激活密钥: BG2KW-D62DF-P4HY6-6J ...

  7. 前端性能测试工具 : dynaTrace Ajax (还没写完)

    今天开始写这个工具, #什么是dynaTrace Ajax? 随着 jQuery.Dojo.YUI 等框架的兴起让构建 Web2.0 应用更加容易,但随之带来的定位等应用问题也越来越难,尤其是与性能相 ...

  8. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  9. JEECG MiniDao优劣

    Minidao 1.5.1 - 我认为这是一个不严谨的错误 - andotorg的个人空间 - OSCHINAhttps://my.oschina.net/antsdot/blog/1800832 M ...

  10. Web Application Framework

    ASP.NET Boilerplate https://github.com/aspnetboilerplate ASP.NET Boilerplate - Web Application Frame ...