在构建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. 基于swoole的聊天室模型

    client.html: <!doctype html><html><head> <meta charset="utf-8"> &l ...

  2. bn两个参数的计算以及layer norm、instance norm、group norm

    bn一般就在conv之后并且后面再接relu 1.如果输入feature map channel是6,bn的gamma beta个数是多少个? 6个. 2.bn的缺点: BN会受到batchsize大 ...

  3. python中numpy.sum()函数

    讲解清晰,转载自:https://blog.csdn.net/rifengxxc/article/details/75008427 众所周知,sum不传参的时候,是所有元素的总和.这里就不说了. 1 ...

  4. Ubuntu安装后配置

    配置源将所有源配置为华科(mirrors.hust.edu.cn)或者中科大源(mirrors.ustc.edu.cn)使用vi编辑,使用命令 :%s/ubuntu源地址.com/mirrors.hu ...

  5. jQuery----奇偶选择器和索引选择器

    奇偶选择器: $( " #uu>li:odd").css( " backgroundColor "," red " ); 获取id为u ...

  6. Disruptor时序调用

    接下来,我会对disruptor的设计和源码上进行讲解,先来一篇时序图,简单理解下disruptor的工作过程

  7. phpqrcode生成动态二维码简单实例

    这是一个利用phpqrcode生成动态二维码简单实例,比微信官方提供的接口还要好用.二维码是动态的,不用生成图片,可自定义二维码大小,间隙,跳转地址等. 参数设置: include_once 'php ...

  8. TMS Xdata Server

    Xdata 在TMS中扮演的桥的角色,一年前仔细看过TMS 的源码,当时对流程很清晰,随着时间慢慢的过去,现在该忘记的都忘记了.所以用此文章来记录自己对Xdata还剩下的一点点的记忆... 光有xda ...

  9. linux下pcf8563驱动时钟使用

    环境: HelperA64开发板 Linux3.10内核 时间:2019.01.17 目标:PCF8563实时时钟驱动的使用 问题:因为pcf8563的驱动是linux内核自带的,网上也有很多分析的方 ...

  10. 函数的返回值是void

    #include <stdio.h> void sub(int x,int y,int z){ z=y-x; } void main() { int a=1,b=2,c=3; sub(10 ...