关于java:使用-Dockerfile-定制镜像

7次阅读

共计 2001 个字符,预计需要花费 6 分钟才能阅读完成。

这里以简略定制 Nginx 镜像为例

创立 Dockerfile 文件


创立 Dockerfile 文件

$ mkdir /usr/local/docker
$ cd /usr/local/docker
$ mkdir nginx
$ cd nginx
$ vi Dockerfile

Dockerfile 文件的内容如下

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

这个 Dockerfile 很简略,一共就两行。波及到了两条指令,FROMRUN

FROM 指令

  • 通常状况下,定制镜像都须要指定一个镜像为根底,在其上进行定制,因而一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令
  • 除了抉择现有镜像为根底镜像外,Docker 还存在一个非凡的镜像,名为 scratch。这个镜像是虚构的概念,并不理论存在,它示意一个空白的镜像,应用这种非凡镜像,意味着不以任何操作系统为根底,会让镜像体积变得更加玲珑,应用 Go 语言 开发的利用很多会应用这种形式来制作镜像

    FROM scratch
    ...

RUN 指令

  • RUN 指令是用来执行命令的,是 Dockerfile 定制镜像中最罕用的指令之一
  • 如果遇到多条 RUN 指令一起执行的状况:

    FROM debian:jessie
    
    RUN apt-get update
    RUN apt-get install -y gcc libc6-dev make
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz"
    RUN mkdir -p /usr/src/redis
    RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
    RUN make -C /usr/src/redis
    RUN make -C /usr/src/redis install

    注:在 Dockerfile 中执行每一个指令都会建设一层文件,然而 Union FS 是有最大层数限度的。

    下面的 Dockerfile 正确写法如下:

    FROM debian:jessie
    
    RUN buildDeps='gcc libc6-dev make' \
        && apt-get update \
        && apt-get install -y $buildDeps \
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
        && mkdir -p /usr/src/redis \
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
        && make -C /usr/src/redis \
        && make -C /usr/src/redis install \
        && rm -rf /var/lib/apt/lists/* \
        && rm redis.tar.gz \
        && rm -r /usr/src/redis \
        && apt-get purge -y --auto-remove $buildDeps

    这样的话,实现了将 7 层文件简化为 1 层文件。另外,每一层构建完之后要删掉无关文件,否则会造成镜像臃肿。

构建镜像


在 Dockerfile 文件所在目录下应用 build 命令

$ docker build -t nginx:v1 .

构建实现后,执行以下命令

$ docker images

会发现多了一个镜像名为 nginx,标签名为 v1 的镜像

其余 Dockerfile 指令


COPY 指令

个别用于从主机复制文件到容器

COPY < 源门路 > < 指标门路 >

比方:

COPY package.json /usr/src/app/

< 源门路 > 能够是多个,甚至能够是通配符。比方:

COPY hom* /mydir/
COPY hom?.txt /mydir/

< 指标门路 > 能够是容器内的绝对路径,也能够是绝对于工作目录的相对路径(工作目录能够用 WORKDIR 指令来指定),指标门路不须要当时创立,如果目录不存在会在复制文件前后行创立缺失目录。

还值得注意的一点是:应用 COPY 指令,文件的各种元数据都会保留。比方读、写、执行权限、文件变更工夫等。

ADD 指令

ADD 指令和 COPY 实质上根本一样,但在 COPY 的根底上增加了一些性能:

比方原门路能够为 URL,下载后的文件权限默认设置为 700,也就是以后用户有可读可写可执行权限,而用户组和其余用户没有任何权限。如果下载的文件是一个压缩包,会主动解压缩

COPYADD 指令中抉择的时候,能够遵循这样的准则,所有的文件复制均应用 COPY 指令,仅在须要主动解压缩的场合应用 ADD

更多指令详解参考官网文档

  • Dockerfile 官网文档
  • Dockerfile 最佳实际文档
  • Docker 官网镜像 Dockerfile

更多干货请移步:https://antoniopeng.com

正文完
 0