在构建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. 20165318 2017-2018-2 《Java程序设计》第二周学习总结

    20165318 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习了第二章和第三章的内容,掌握了Java中基本数据类型.数组.运算符.表达式和语句等方 ...

  2. 1491. [NOI2007]社交网络【最短路计数】

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...

  3. 搭建高可用mysql系列(1)-- Percona XtraDB Cluster介绍

    Percona XtraDB Cluster (下文简称PXC)是一个开源的mysql 高可用解决方案.它将Percona Server和Percona XtraBackup与Galera库集成在一起 ...

  4. centos7 tengine 安装

    Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...

  5. 记一次ajax交互问题

    问题描述:仍然在表单中,像往常一样,异步获取表单内所有输入框的信息,点击提交,确实也走了后台,但是结果却走了ajax的error.这一点使我当时非常疑惑,为什么会走error呢? 一般走error的原 ...

  6. List集合和iterator并发异常处理

    一:List接口: 子类:ArrayList   LinkedList 特点:Unlike sets, lists typically allow duplicate elements.不像set集合 ...

  7. 443 B. Table Tennis

    http://codeforces.com/contest/879/problem/B n people are standing in a line to play table tennis. At ...

  8. 【图像处理】Schmid滤波器

    Schmid也是一种类Gabor图像滤波器,在这篇文章[1]中有详细推导和介绍. 一种更简洁的表达公式是: 当中,r为核半径,Z为归一化參数,τ和σ是比較重要的參数,在ReID提取TextFeatur ...

  9. MySQL 5.7(免安装版)的下载,安装(配置)

    本文适合初学JAVA,要用到MySQL开发的学习者. 第一步.下载MySQL 1. 百度mysql,找到官网,点击进入. 2. 进入官网,点击DOWNLOADS,在DOWNLOADS菜单栏中点击Com ...

  10. member access within misaligned address 0x0000002c3931 for type 'struct ListNode‘

    From MWeb 在做leetcode 第2题时使用C语言编写链表时报错 错误复现 错误原因 解决办法 错误复现 报错时的代码如下 /** * Definition for singly-linke ...