要将自己开发的应用程序容器化,想必需要制作自己的 Image。制作 Image 也是一种艺术,我们要如何让自己的应用程序制造的 Image 能有更小的资源来使用。
我们都知道 Dockerfile 是建构 image 的档案。
下面这张图是 Dockerfile 可以使用的关键字
我觉得 cmd
和 ENTRYPOINT
这两个可以理解一下,我有时会搞混哈。在 Dockerfile 中,只能有一个 ENTRYPOINT 或 CMD 指令,如果有多个ENTRYPOINT 或 CMD 指令则以最後一个为准。
下面是建立一个 Nginx Image 的 Dockerfile 范例
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y nginx
COPY . /var/www/html/
EXPOSE 80
#ENTRYPOINT ["nginx"]
CMD ["nginx", "-g", "daemon off;"]
有了 Dockerfile 後我们就可以建构 Image 了,使用 docker build -t {ImageName}:{tag01} .
建构
使用 docker images
查看建构的 image
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v0 55077273116a 20 minutes ago 222MB
Image 原则上应该越小越好,下面范例则是会把一些类似快取的东西或是历史纪录给拔掉
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y nginx \
&& rm -rf /var/lib/apt/lists/*
COPY . /var/www/html/
EXPOSE 80
#ENTRYPOINT ["nginx"]
CMD ["nginx", "-g", "daemon off;"]
最後 Image 减少了一些大小。
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v0.1 d17658937ea9 2 minutes ago 209MB
接下来直接给一个建构 Spring boot 的范例,专案如果是用 gradle 建立,应当会使用 gradle 进行建构和测试,所以我们使用了 gradle 进行第一层的建构和测试,当这一个 gradle 建构和测试结果成功後会有一个应用程序的 jar 档。
这边我们用运了 multi-stage 方式进行建构,这会使得 CICD 过程更加简易。後续要运行 Jar 档的 Image 透过指令(--from)取得前面键建构所产生的档案 (artifacts)。
FROM gradle:4.10.2-slim as builder
USER root
COPY . .
RUN gradle clean build
FROM adoptopenjdk/openjdk8-openj9:jdk8u181-b13_openj9-0.9.0-slim
COPY --from=builder /home/gradle/build/libs/test-0.0.1-SNAPSHOT.jar /usr/local/test_workspace/test-0.0.1-SNAPSHOT.jar
RUN apt-get update && \
apt-get install -y tzdata ttf-dejavu fontconfig && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
mkdir /usr/local/logs
ENV LANG C.UTF-8
# Timezone
ENV TZ=Asia/Taipei
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "test-0.0.1-SNAPSHOT.jar"]
有关权限设置的内容可参考此链结
<<: 铁人赛 Day4 -- XAMPP到底有多神 & MySQL的安全性设定
Quiz: Missing Lines 题目说明: 下面程序码以图表方式呈现,可看出物件与类别之间的...
今天会是比较划水的回忆篇,可以斟酌看看。 这周开始正式学习 javascript,然後那时候疫情还没...
上一篇我们讲到建立一个UItable View的一些基本方法,接下来我们可以建立一些资料在上面 va...
铁人赛的最後一天 以三个前端比较常见的情境练习需求来总结第五部分 今天的内容 一、注册表单 二、产品...
一、什麽是资料结构 ? 当我们撰写程序时,会宣告变数来存放资料,这些资料会储存在记忆体中,在我们需要...