使用Dockerfile构建镜像

短命女 2023-08-17 16:34 251阅读 0赞

构建镜像方式有三种
1.使用工具(febootstrap,supermin)等工具制作系统镜像。适合构建符合要求的基础镜像包
2.使用已有基础镜像,启动后进行修改。等调整完毕,使用commin命令进行保存镜像。
3.使用Dockerfile脚本进行构建镜像。

使用Dockerfile脚本在基础系统镜像上构建匹配的镜像包。

组成部分


























部分 命令
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT

各命令详解


FROM
指定哪种镜像作为新镜像的基础镜像,如:

  1. FROM ubuntu:14.04

MAINTAINER
指明该镜像的作者和其电子邮件,如:

  1. MAINTAINER author "xxxxxxx@qq.com"

RUN
在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行,如:

  1. RUN echo 'hello docker!' \
  2. > /usr/local/file.txt

也可以使用exec格式RUN [“executable”, “param1”, “param2”]的命令,如:

  1. RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是参数.

COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

  1. COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下

因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
如果复制目录,需要写全docker中同名目录

ADD
将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:

  1. ADD application.yml /etc/springboot/hello-service/src/resources

但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

  1. EXPOSE 8080
  2. EXPOSE 8081
  3. ...

WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如:

  1. WORKDIR /usr/local
  2. WORKDIR webservice
  3. RUN echo 'hello docker' > text.txt
  4. ...

最终会在/usr/local/webservice/目录下生成text.txt文件

ONBUILD
当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A

  1. FROM ubuntu
  2. ...
  3. ONBUILD ADD . /var/www
  4. ...

然后创建镜像image-B,指定image-A为基础镜像,如

  1. FROM image-A
  2. ...

然后在构建image-B的时候,日志上显示如下:

  1. Step 0 : FROM image-A
  2. # Execting 1 build triggers
  3. Step onbuild-0 : ADD . /var/www
  4. ...

USER
指定该镜像以什么样的用户去执行,如:

  1. USER mongo

VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据).如:

  1. VOLUME /data/db /data/configdb

注意:VOLUME 主机目录 容器目录

CMD
容器启动时需要执行的命令,如:

  1. CMD /bin/bash

同样可以使用exec语法,如

  1. CMD ["/bin/bash"]

当有多个CMD的时候,只有最后一个生效。

ENTRYPOINT
作用和用法和CMD一样


CMD和ENTRYPOINT的区别

CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:

  • CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
  • CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖.

示例

vim Dockerfile

  1. FROM harbor.k8s.test/os/centos_base:v7.5
  2. MAINTAINER taoyx "taoyx@taoyx.cc"
  3. WORKDIR /
  4. EXPOSE 22
  5. COPY jdk1.8.0_221 /usr/local/jdk1.8.0_221/
  6. RUN ln -s /usr/local/jdk1.8.0_221/bin/java /usr/sbin/
  7. ENTRYPOINT ["/bin/bash"]

执行构建镜像命令步骤

  1. docker build -t harbor.k8s.test/os/centos_java:v7.5 .
  2. docker images harbor.k8s.test/os/centos_java:v7.5

使用alpine-glibc镜像包,添加java环境,将程序service-test打包进镜像,添加启动命令。

  1. cat > Dockerfile <<EOF
  2. FROM jeanblanchard/alpine-glibc:latest
  3. MAINTAINER taoyx "taoyx@taoyx.cc"
  4. WORKDIR /
  5. EXPOSE 19080
  6. COPY jre1.8.0_221 /usr/local/jre1.8.0_221/
  7. RUN ln -s /usr/local/jre1.8.0_221/bin/java /usr/bin/
  8. COPY service-test/opt/service-test
  9. WORKDIR /opt/service-test
  10. ENTRYPOINT java -jar service-test.jar && /bin/sh
  11. EOF
  12. docker build -t harbor.k8s.test/service/service-test:1.0.0 .
  13. docker tag harbor.k8s.test/service/service-test:1.0.0 harbor.k8s.test/service/service-test:latest
  14. docker run --name service-test -d -h 0.0.0.0 -p 19080:19080 --restart always harbor.k8s.test/service/service-test:latest

精简JAVA (JRE)
1、下载压缩包 下载地址 https://www.java.com/en/download/manual.jsp
2、解压压缩包

  1. tar zxvf jre-8u221-linux-x64.tar.gz

3、删除其他文件

  1. cd jre1.8.0_221
  2. rm -rf README THIRDPARTYLICENSEREADME-JAVAFX.txt Welcome.html COPYRIGHT LICENSE release THIRDPARTYLICENSEREADME.txt
  3. rm -rf lib/plugin.jar \
  4. lib/ext/jfxrt.jar \
  5. bin/javaws \
  6. lib/javaws.jar \
  7. lib/desktop \
  8. plugin \
  9. lib/deploy* \
  10. lib/*javafx* \
  11. lib/*jfx* \
  12. lib/amd64/libdecora_sse.so \
  13. lib/amd64/libprism_*.so \
  14. lib/amd64/libfxplugins.so \
  15. lib/amd64/libglass.so \
  16. lib/amd64/libgstreamer-lite.so \
  17. lib/amd64/libjavafx*.so \
  18. lib/amd64/libjfx*.so

转载于:https://www.cnblogs.com/taoyuxuan/p/11245438.html

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dockerfile构建镜像

    dockerfile是什么 一套构建docker镜像的脚本语言,就像每种开发语言都有自己的编写规范一样,dockerfile也是如此,通过编写dockerfile文件,然

    相关 Dockerfile构建镜像

    以创建一个web服务器的镜像为例: 首先创建一个目录并进入创建Dockerfile文件。这个目录是构建环境还有在构建过程中需要上传到构建镜像中文件的本地存放位置 m

    相关 使用Dockerfile构建镜像

    > 构建镜像方式有三种 > 1.使用工具(febootstrap,supermin)等工具制作系统镜像。适合构建符合要求的基础镜像包 > 2.使用已有基础镜像,启动后进

    相关 dockerfile 镜像构建

    docker镜像的构建:commit与dockerfile 构建镜像 docker容器与镜像 当创建一个新容器时,docker会构建出一个镜像栈,每个只读镜像层