Docker基础之Dockerfile(2)

Docker基础之Dockerfile(2)

来源:Docker官方文档
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像。

Dockerfile基础语法

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行,Dockerfile分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

接下来将根据一条条指令的学习过程中,为我的服务(一个简单的flask项目,开发端口8888和主线端口18888)写一个Dockfile文件,并构建Dockerfile镜像、然后放到我远程注册服务上。

第一行必须指定基础镜像

Dockerfile的第一行必须指定基础镜像,同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

# 格式
FROM <image> 或FROM <image>:<tag> 
# 举例
FROM oraclelinux:8-slim

个人服务使用基础镜像为python最新版本

   FROM python:latest
维护者信息

MAINTAINER 7wencaixu 7wencaixu@email.com

镜像操作指令
1. RUN

每运行一条RUN指令,镜像添加新的一层,并提交。主要有两种方式,一种类似于linux命令方式,第二种可以exec执行,指定终端,分别如下:

  1. linux命令方式
    # 将RUN理解为linux的$命令提示符是不是好理解一点
    RUN <command> 
    # 举例
    RUN yum install net-tools
  1. exec执行指定终端
    RUN <"executable","param1","param2">
    # 举例
    RUN['/bin/bash','-c','echo hello']

注意:因为如上所说,每使用RUN指令都会创建一个层,为了减少层的创建,可以使用&&去优化。案例如下:

RUN mkdir /webtest.d && \
    pip install flask -i https://pypi.douban.com/simple
容器启动时执行指令

CMD

每个Dockerfile只能有一条CMD命令,如果指定多条,只有最后一条执行,主要作用是:为启动程序指定默认的运行程序,类似于linux的开机自启。格式主要有两种:

CMD <command> 
CMD ["command | excuable file","<param1>",...] 
CMD ["<param1>","<param2>",...] 
# 案例
CMD python start.py
EXPOSE

告诉Docker服务端容器暴露的端口号列表,告诉运维或开发者该容器暴露了哪些端口。

# 格式
EXPOSE <port1> <port2> 
# 案例
EXPOSE 8888 18888
ENV

指定一个环境变量,会被后续RUN指令或其他指令使用,并在容器中运行时保持

# 格式
ENV <key> <value>
# 案例
ENV SERVER_NAME="webtest"
ENV LOG_PATH=/usr/local/logs/$SERVER_NAME/runtime.log
ADD

该命令将复制指定 到容器中的 其中可以是Dockerfile所在目录的相对路径也可以是一个URL。如果是压缩包,则会自动解压。

  # 格式
  ADD <src> <dest>
  # 案例
  ADD ./project.d  webtest.d/ # 会将project.d文件拷贝到webtest.d下
COPY

COPY 复制主机的为容器中的.目标路径不存在时会自动创建

  # 格式
  COPY src dest
VOLUME

格式VOLUME["/data"] 创建一个可以从本地主机或其他容器挂在的挂载点,一般用来存放数据库和需要保持的数据等

   VOLUME ["<路径1>", "<路径2>"...]
   VOLUME <路径>

构建镜像命令

  docker build -t 7wencaixu/webtest .

完整构建代码(个人服务暂不开源)

服务代码
  from flask import Flask
import datetime

server=Flask(__name__)

@server.route('/time',methods=['post','get'])
def get_time():
    now=str(datetime.datetime.now())
    return "current time YYYY-MM-DD HH:mm:SS :%s"%now

server.run(port=8888)
完整Dockerfile
#
# NOTE:THIS DOCKERFILE IS CREATE BY wencai.xu 
# 
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM python:latest

LABEL maintainer="7wencaixu" email="wencai.xu@gmail.com"

ENV SERVER_NAME="webtest"
ENV LOG_PATH=/usr/local/logs/$SERVER_NAME/runtime.log

RUN touch $LOG_PATH  && \
    mkdir /webtest.d && \
    pip install flask -i https://pypi.douban.com/simple && \
    pip install datetime -i https://pypi.douban.com/simple

ADD ./project.d  webtest.d/

WORKDIR /webtest.d/project.d

EXPOSE 8888 18888
CMD python start.py > $LOG_PATH
测试
 curl ip:8888/time

看相声也要敲代码社区说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值