在构建Docker时编译应用

一般有两种方法在构建镜像时进行打包应用。第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译app.

1. 案例1:

(1)Dockerfile内容如下

PS E:\DockeronWindows\> cat .\Dockerfile

FROM microsoft/dotnet:1.1-sdk-nanoserver

WORKDIR /src

COPY src/ .

RUN dotnet restore; dotnet build

CMD ["dotnet", "run"]

(2)进行构建

PS E:\DockeronWindows\Chapter02\ch02-dotnet-helloworld> docker image build --tag dockeronwindows/ch02-dotnet-helloworld .

Sending build context to Docker daemon   7.68kB

Step 1/5 : FROM microsoft/dotnet:1.1-sdk-nanoserver

1.1-sdk-nanoserver: Pulling from microsoft/dotnet

bce2fbc256ea: Already exists

58518d668160: Pulling fs layer

fc38482307fa: Pulling fs layer

576bbc86ac65: Pulling fs layer

7ad73ad8deab: Pulling fs layer

ab1b680e44fb: Pulling fs layer

5f89579d77cc: Pulling fs layer

39f2f6871254: Pulling fs layer

19e7bac74ddd: Pulling fs layer

ab1b680e44fb: Waiting

5f89579d77cc: Waiting

39f2f6871254: Waiting

19e7bac74ddd: Waiting

7ad73ad8deab: Waiting

576bbc86ac65: Verifying Checksum

576bbc86ac65: Download complete

fc38482307fa: Verifying Checksum

fc38482307fa: Download complete

7ad73ad8deab: Verifying Checksum

7ad73ad8deab: Download complete

58518d668160: Verifying Checksum

58518d668160: Download complete

5f89579d77cc: Download complete

39f2f6871254: Download complete

58518d668160: Pull complete

fc38482307fa: Pull complete

576bbc86ac65: Pull complete

7ad73ad8deab: Pull complete

ab1b680e44fb: Verifying Checksum

ab1b680e44fb: Download complete

ab1b680e44fb: Pull complete

5f89579d77cc: Pull complete

39f2f6871254: Pull complete

19e7bac74ddd: Verifying Checksum

19e7bac74ddd: Download complete

19e7bac74ddd: Pull complete

Digest: sha256:784d5f6ceef9a22d0ae224ea0e81869d2ef1348fa6611f6390da992b0661adc0

Status: Downloaded newer image for microsoft/dotnet:1.1-sdk-nanoserver
  ---> cade360c069b

Step 2/5 : WORKDIR /src

Removing intermediate container 581b35c929dc
  ---> df0351fc439b

Step 3/5 : COPY src/ .
  ---> 1769be54acaa

Step 4/5 : RUN dotnet restore; dotnet build
  ---> Running in 97b2eb76f163
   Restoring packages for C:\src\HelloWorld.NetCore.csproj...
   Generating MSBuild file C:\src\obj\HelloWorld.NetCore.csproj.nuget.g.props.
   Generating MSBuild file C:\src\obj\HelloWorld.NetCore.csproj.nuget.g.targets.
   Restore completed in 10.8 sec for C:\src\HelloWorld.NetCore.csproj.

Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core

Copyright (C) Microsoft Corporation. All rights reserved.

HelloWorld.NetCore -> C:\src\bin\Debug\netcoreapp1.1\HelloWorld.NetCore.dll

Build succeeded.
     0 Warning(s)
     0 Error(s)

Time Elapsed 00:00:02.63

Removing intermediate container 97b2eb76f163
  ---> 48609d781e5b

Step 5/5 : CMD ["dotnet", "run"]
  ---> Running in 8906b368d1ed

Removing intermediate container 8906b368d1ed
  ---> f061c5025519

Successfully built f061c5025519

Successfully tagged dockeronwindows/ch02-dotnet-helloworld:latest

2. 第二种方法就是在构建镜像之前进行编译文件。

(1)Dockerfile文件内容如下

PS E:\DockeronWindows\Chapter02\ch02-dotnet-helloworld> cat .\Dockerfile.slim

FROM microsoft/dotnet:1.1-runtime-nanoserver

WORKDIR /dotnetapp

COPY ./src/bin/Debug/netcoreapp1.1/publish .

CMD ["dotnet", "HelloWorld.NetCore.dll"]

(2)简单的编译应用和构建Docker镜像看起来如下:

dotnet restore src; dotnet publish src

docker image build --file Dockerfile.slim --tag dockeronwindows/ch02-dotnet-helloworld:slim .

编译截图:

构建镜像截图:


(3)可以看到,在编译前和编译后进行构建镜像,两个容器之间的大小差异,主要是在构建镜像时进行编译,容器需要安装构建工具。


3. 多阶段的构建和编译

(1)Dockerfile.multistage文件内容如下

PS E:\DockeronWindows\Chapter02\ch02-dotnet-helloworld> cat .\Dockerfile.multistage

# build stage

FROM microsoft/dotnet:1.1-sdk-nanoserver AS builder

WORKDIR /src

COPY src/ .

RUN dotnet restore; dotnet publish

# final image stage

FROM microsoft/dotnet:1.1-runtime-nanoserver

WORKDIR /dotnetapp

COPY --from=builder /src/bin/Debug/netcoreapp1.1/publish .

CMD ["dotnet", "HelloWorld.NetCore.dll"]

(2)第(1)步主要是把1,2阶段进行合并了,先执行编译,然后运行第2个容器执行。

4. Dockerfile指令

(1)构建镜像 ,Dockerfile内容如下

PS E:\DockeronWindows\Chapter02\ch02-static-website> cat .\Dockerfile

# escape=`

FROM microsoft/iis

SHELL ["powershell"]

ARG ENV_NAME=DEV

EXPOSE 80

COPY template.html C:\template.html

RUN (Get-Content -Raw -Path C:\template.html) `
      -replace '{hostname}', [Environment]::MachineName `
      -replace '{environment}', [Environment]::GetEnvironmentVariable('ENV_NAME') `
     | Set-Content -Path C:\inetpub\wwwroot\index.html

(2)进行构建

docker image build --build-arg ENV_NAME=TEST --tag dockeronwindows/ch02-static-website .

(3)运行容器

> docker container run --detach --publish 80 dockeronwindows/ch02-static-website

3472a4f0efdb7f4215d49c44dcbfc81eae0426c1fc56ad75be86f63a5abf9b0e

(4)检查容器的IP地址

> docker container inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' 3472

172.26.204.5

(5)可以通过本机的浏览器进行访问

打包应用和构建Docker镜像(docker在windows上)的更多相关文章

  1. 添加ssh服务构建新镜像-docker commit 方式01

    添加ssh服务构建新镜像-docker commit 方式 1:docker commit构建自定义镜像---一般不推荐使用这种方式构建新镜像 1:ubuntu基础镜像下载 ubuntu@ubuntu ...

  2. Docker构建YApi镜像, Docker安装YApi, Docker部署YApi

    概述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发 ...

  3. 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作

    实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一个Python数据分析开发环境的Dock ...

  4. 通过重新上传修改后的docker镜像来在kubeapps上实现k8s上部署的nginx版本更新,回退等

    docker操作:制作自定义镜像 # docker下载官方nginx镜像 docker pull nginx # 基于该镜像运行一个容器 docker run -it -d --name nginx_ ...

  5. Linux 含有ext 分区的镜像无法再Windows上拷贝的解决办法

    首先,参考http://www.cnblogs.com/chenfulin5/p/6649801.html 通过上面这个链接,做一个镜像出来. // 1. 制作一个镜像文件,里面包含200M左右的空间 ...

  6. 多阶段构建Golang程序Docker镜像

    Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docker在 ...

  7. Docker:镜像构建与进入容器总结

    构建镜像总结 docker构建镜像有两种方法: 1.使用docker commit + 容器 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] ...

  8. 在sun jdk 8镜像基础上构建maven 3的docker镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...

  9. Docker镜像、容器剖析

    我们通常所说的docker是什么? 在这里英文本意为“搬运工”这里指的的docker搬运点的是集装箱,集装箱装的是够任意类型的APP,开发者通过Docker可以将app变成一种标准化,可移植的.自管理 ...

  10. docker镜像管理(二)

    docker镜像 docker镜像含有启动容器所需要的文件系统和内容,因此,其用于创建并启动docker容器 docker镜像采用分层构建机制,最底层为bootfs,其之为rootfs bootfs: ...

随机推荐

  1. [USACO08NOV]Mixed Up Cows

    嘟嘟嘟 一看n那么小,那一定是状压dp了(表示从没写过,慌). 首先dp[i][j](i 是一个二进制数,第x位为1代表选了第x头牛),表示 i 这个状态最后一头牛是第 j 头牛时的方案数. 然后当 ...

  2. openresty + orange centos7 安装

    Orange Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下特性: ...

  3. Kafka设计解析(七)Kafka Stream

    转载自 技术世界,原文链接 Kafka设计解析(七)- Kafka Stream 本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka ...

  4. Spring Cloud和Dubbo整合开发笔记(1)

    一.需求背景: 公司内部老项目微服务技术栈使用Dubbo, 新项目技术栈使用主流的Spring Cloud相关组件开发,新旧项目涉及交互调用,无法直接通信数据传递. 老项目基于Dubbo,重构代码升级 ...

  5. 01_Docker概念简介、组件介绍、使用场景和命名空间

    一.简介 Docker是一个能够把开发的应用程序自动部署到容器的开源引擎.Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎.该引擎的目标就是提供一个轻量.快速的环境,能够运行开发者的程序 ...

  6. 笔记:iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)(别人的代码直接复制过来的,我脸皮有点厚)

    NSString* str=@"hello";//存在代码区,不可变 NSLog(@"%@",str); //1.[字符串插入] NSMutableString ...

  7. 【Mac 快捷键】 (不定时持续更新)

    显示/取消显示隐藏文件 command + shift + .

  8. STM32中EXTI和NVIC的关系

    (1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册>C ...

  9. 筑基期—C语言

    1.1 环境: 在ANSIC的任何一种是实现中,存在两种不同的环境.第一种是翻译环境,第二种是执行环境.标准明确说明这两种环境不必在同一台机器上,交叉编译器就是在一台机器上运行,但它所产生的可执行代码 ...

  10. Go指南 - 笔记

    Go指南 - 笔记 标签(空格分隔): Go Go指南 一.基础 1.包 每个Go程序都是由包构成的. 程序从main包开始运行. 包名与导入路径的最后一个元素一致 2.导入 分组导入:使用圆括号组合 ...