【Docker】之 Dockerfile

Dockerfile 使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用 docker build 命令基于该Dockerfile中的指令构建一个新的镜像。

一、一个小栗子


构建一个包含可执行文件的Docker镜像,并运行。

(1)构建一个hello.c 文件,并编译
#include<stdio.h>
int main(void) {
    printf("hello docker !");
    return 0;
}

这里写图片描述


(2)用Dockerfile构建一个镜像

这里写图片描述

FROM scratch  # FROM 指定一个已经存在的镜像(基础镜像 base image), 制作base image
ADD hello /   # 添加到根目录
CMD ["/hello"] # CMD 指令用于指定一个容器启动时要运行的命令


(3)docker build

sudo docker build -t donaldy/hello-world .
这里写图片描述




二、Dockerfile 语法


官方文档 : https://docs.docker.com/engine/reference/builder/#known-issues-run

(1)FROM

尽量使用官方的image作为base image

FROM scratch  # 制作base image
FROM centos   # 使用base image


(2)LABEL

LABEL Metadata 不可少

LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description"


(3)RUN

RUN : 执行命令并创建新的Image Layer

每使用一层run 就会生成一层 image

为了美观,复杂的RUN请用反斜线换行!
避免无用分层,合并多条命令成一行!

# 反斜线换行
RUN yun update && yun install -y vim \
    python-dev

# 注意清理cache
RUN apt-get update && apt-get install -y perl\
    pwgen --no-install-recommends && rm -rf \
    /var/lib/apt/lists/* 


(4)WORKDIR

设定当前工作目录

用WORKDIR,不要用 RUN cd!
尽量使用绝对目录!

WORKDIR /root

WORKDIR /test  # 如果没有回自动创建test目录
WORKDIR demo
RUN pwd        # 输出结果应该是 /test/demo


(5)ADD and COPY

大部分情况, COPY 优于 ADD!

ADD处理COPY 还有额外功能(压缩)!

添加远程文件/目录请使用curl 或者 wget

ADD hello /

ADD test.tar.gz / # 添加到根目录并解压

WORKDIR /root
ADD hello test/  # /root/test/hello

WORKDIR /root
COPY hello test/


(6)ENV

设定环境变量

尽量使用ENV增加可维护性!

ENV MYSQL_VERSION 5.6 # 设置常亮

RUN apt-get install -y mysql-server= "${MYSQL_VERSION}" \
    && rm -rf /var/lib/apt/lists/*  # 引用常亮


(7)VOLUME and EXPOSE

存储和网络


(8)CMD and ENTRYPOINT

CMD : 设置容器启动后默认执行的命令和参数

ENTERYPOINT: 设置容器启动时运行的命令

Shell 格式

RUN apt-get install -y vim
CMD echo "hello docker "
ENTERYPOINT echo "hello docker"

Exec 格式

RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "hello docker"]
ENTERYPOINT ["/bin/echo", "hello docker"]
CMD
  1. 容器启动时默认执行的命令
  2. 如果docker run指定了其他命令,CMD命令被忽略
  3. 如果定义了多个CMD,只有最后一个会执行
ENTERYPOINT
  1. 让容器以应用程序或者服务的形式运行
  2. 不会被忽略,一定会执行
  3. 最佳实践: 写一个shell脚本作为entrypoint
    COPY docker-entrypoint.sh /usr/local/bin/
    ENTRYPOINT ["docker-entrypoint.sh"]
    EXPOSE  27017
    CMD ["mongod"]

猜你喜欢

转载自blog.csdn.net/fanfan4569/article/details/80702713