Docker技术随记(五):Dockerfile语法梳理及最佳实践

FROM

## Ps.尽量使用官方的image作为base image!
FROM scratch   # 制作base image
FROM centos    # 使用base image
FROM ubuntu:14.04    # 指定base image及版本号

LABEL

## Ps. Metadata不可少!
LABEL maintainer="jack18588951684@163.com"
LABEL version="1.0"
LABEL description="This is description"

RUN

RUN yum update && yum install -y vim python-dev  
RUN apt-get update && apt-get install -y perl pwgen --no-install-recommends && rm -rf /var/lib/apt/lists/*  # 注意清理cache
RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

WORKDIR

## Ps. 用WORKDIR,不要用RUN cd!而且尽量使用绝对目录!
WORKDIR /root
WORKDIR /test   # 如果没有会自动创建test目录
WORKDIR demo
RUN pwd              # 输出结果应该是/test/demo

ADD and COPY

## Ps.
## 1. 大部分情况,COPY
## 2. ADD除了COPY还有额外功能(解压)
## 3.添加远程文件/目录请使用curl或者wget
ADD hello /
ADD test.tar.gz /  # 添加到根目录并解压
WORKDIR /root
ADD hello test/    # /root/test/hello
WORKDIR /root
COPY hello test/

ENV

## Ps. 尽量使用ENV增加可维护性
ENV MYSQL_VERSION 5.6  # 设置常量
RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/*  # 引用常量

CMD

  • 容器启动时默认执行的命令
  • 如果docker run指定了其它命令,CMD命令被忽略
  • 如果定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"

======================================
情况1.docker run [image]输出?
>> hello Docker
情况2.docker run -it [image] /bin/bash输出?
无输出,进入容器内
======================================

ENTRYPOINT

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行
  • 最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD ["mongod"]

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
================================================
情况1.docker run [image]输出?
>> hello Docker
情况2.docker run -it [image] /bin/bash输出?
>> hello Docker
================================================

RUN vs CMD vs ENTRY

  • RUN:执行命令并创建新的Image Layer
  • CMD:设置容器启动后默认执行的命令和参数
  • ENTRYPOINT:设置容器启动时运行的命令

Shell和Exec格式

## Shell格式
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

## Exec格式
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]

## Dockerfile1
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
## Dockerfile2
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo","hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

Dockerfile创建工具镜像

## Step 1.Dockerfile
==========================================
FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD []
==========================================

## Step 2.build镜像
docker build -t jack0117/ubuntu-stress .

## Step 3.创建容器
docker run -it jack0117/ubuntu-stress --vm 1 --verbose 

## Ps.ENTRYPOINT配合CMD可以给执行命令加参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值