在构建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. Android学习路线总结,绝对干货(转)

    转自:https://www.cnblogs.com/yishaochu/p/5436094.html 一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉 ...

  2. [USACO08DEC]Patting Heads

    嘟嘟嘟 这题还是比较水的.首先O(n2)模拟显然过不了,那就换一种思路,考虑每一个数对答案的贡献,显然一个数a[i]会对后面的a[i] * 2, a[i] * 3,a[i] * 4……都贡献1,.那么 ...

  3. Linux - 常用归档、压缩命令

    1. ncompress compress命令是一个相当古老的 unix 档案压缩指令,压缩后的文件会加上一个 .Z 的后缀名,默认不会保留源文件.compress只能对文件进行压缩,若要压缩目录,先 ...

  4. 理解JavaScript继承(三)

    理解JavaScript继承(三) 通过把父对象的属性,全部拷贝给子对象,也能实现继承. 7.浅拷贝 function extendCopy(p) { var o = {}; for (var pro ...

  5. CentOS部署Kubernetes1.13集群-1(使用kubeadm安装K8S)

    参考:https://www.kubernetes.org.cn/4956.html 1.准备 说明:准备工作需要在集群所有的主机上执行 1.1系统配置 在安装之前,需要先做如下准备.三台CentOS ...

  6. set集合HashSet

    一: 和List接口同一级的还有Set接口,Set类型的集合,元素不能重复,存储顺序和迭代顺序没有必然联系.他的元素的唯一性是由hasCode和equals决定的. 他的子类,常用的HashSet和L ...

  7. “unauthorized: authentication required” -- openshift3.9 docker push 报错

    1.docker tag mybank-tomcat:latest 172.30.25.185:5000/mybank-tomcat:latest 2.当往registrypush镜像的时候, doc ...

  8. Debian 8 安装录屏软件kazam

    1 安装 $ sudo apt-get install kazam [sudo] password for z: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完 ...

  9. HBase的简单java操作

    官方文档:http://hbase.apache.org/book.html java简单操作hbase的表 import org.apache.hadoop.conf.Configuration; ...

  10. js call().apply().bind()的用法

    function Person(age) { this.age = age; } Person.prototype.sayHi = function (x, y) { console.log((x + ...