公司一个使用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. (14)打鸡儿教你Vue.js

    重构 "代码重构" 为什么要进行重构 提高代码的可读性和可维护性 代码中存在着重复的代码 存在过大的类或过长的方法 强依赖.紧耦合的结构 运算逻辑难以理解 代码不能清晰 统一的编码 ...

  2. [golang]Go net.lookup包

    DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址. 域名系统(通常被称为“DNS”)是一个网络系统,允许我们把对人类友好的名称解析为唯一的地址. Int ...

  3. 响应面分析 | response surface analysis | R代码

    先开题,慢慢补充. 参考: 什么是响应面(RSM)分析 Response-Surface Methods in R, Using rsm In-class Examples with R Code R ...

  4. JVM 自定义类加载器在复杂类情况下的运行分析

    一.自定义类加载器在复杂类情况下的运行分析 1.使用之前创建的类加载器 public class MyTest16 extends ClassLoader{ private String classN ...

  5. KS(Kolmogorov-Smirnov)值

    KS(Kolmogorov-Smirnov)值越大,表示模型能够将正.负客户区分开的程度越大.KS值的取值范围是[0,1] ks越大,表示计算预测值的模型区分好坏用户的能力越强. ks值 含义 > ...

  6. FFmpeg编译:mac下编译iOS平台的FFmpeg库(支持armv7, arm64, i386, x86_64)

    环境:FFmpeg 3.4.6Xcode 10.3macOS 10.14.6iOS SDK 12.4 一.准备工作 1. 下载FFmpeg我这里使用的是3.4.6版本的FFmpeg,可以从FFmpeg ...

  7. 漫谈企业应用架构的演变 CRM & etc

    漫谈企业应用架构的演变 goYangKunhttps://mp.weixin.qq.com/s?__biz=MzIzMTc3NTA2NQ==&mid=2247483698&idx=1& ...

  8. 【转载】 linux dig 命令使用方法

    原文地址: https://www.imooc.com/article/26971?block_id=tuijian_wz 作者:ibeautiful来源:慕课网 ------------------ ...

  9. 获取IFC构件的位置数据、方向数据

    获取IFC构件的位置数据.方向数据 std::map<int, shared_ptr<BuildingEntity>> map_buildingEntity = b_model ...

  10. linux非root用户安装ncurses-devel依赖

    很明显,如果我们通过yum或rpm下载安装,始终无法绕开root用户,除非我们不用yum或rpm.嗯,我们直接用源码安装.下载源码包,到http://ftp.gnu.org/gnu/ncurses/我 ...