首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dockerfile语法小解说(二)

dockerfile语法小解说(二)

作者头像
蒋老湿
修改2019-12-09 14:18:33
4700
修改2019-12-09 14:18:33
举报
文章被收录于专栏:技术栈技术栈

关于dockerfile中的关键字

FROM (尽量使用官方的image作为base image)

FROM scratch   #制作base image
FROM centos    # 使用base images
FROM ubuntu: 14.04

LABEL (类似于注释、Metadata)

LABEL maintainer = "jiangpeng@qq.com"
LABEL version = "1.0"
LABEL description = "this is my world"

RUN (运行命令安装软件,为了美观,复杂的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 (用WORKDIR,不要用RUN cd,尽量使用绝对目录!)

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

ADD and COPY (大部分情况,COPY优于ADD!ADD除了COPY还有额外功能解压,添加远程文件/目录请使用curl或wget)

ADD hello /
ADD test.tar.gz /    #添加到根目录并解压
WORKDIR /root
ADD[/COPY] hello test/    # 此时hello文件所在目录为 /root/test/hello

ENV (设置环境变量或常量)

ENV MYSQL_VERSION 5.6    #设置常量
RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* #引用常量

ports(ports暴露容器端口到主机的任意端口或指定端口)

#不管是否指定主机端口,使用ports都会将端口暴露给主机

ports:

  • "80:80" # 绑定容器的80端口到主机的80端口 ### expose(expose暴露容器给link到当前容器的容器) ```javascript #将当前容器的端口3000和8000暴露给link到本容器的容器 expose: 和ports的区别是,expose不会将端口暴露给主机。 **RUN**: 执行命令并创建新的Image Layer **CMD**: 设置容器启动后默认执行的命令和参数,如果docker run指定了其他命令,CMD命令被忽略,如果定义了多个CMD,只有最后一个会执行。 **ENTRYPOINT**: 设置容器启动时运行的命令,让容器以应用程序或服务的形式运行,如果定义了多个ENTRYPOINT,不会被忽略,都会执行 ### shell 与 Exec 格式写法 ```javascript // shell 格式 RUN apt-get install -y vim CMD echo "hello docker" ENTRYPOINT echo "hello docker"
  • "9000:8080" # 绑定容器的8080端口到主机的9000端口
  • "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
  • "3000"
  • "8000"

// 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"

复制代码

dockerfile2中输出的结果为hello $name,如果想要输出hello Docker,则可以dockerfile2中的 "/bin/echo","hello &name" 改为 "/bin/bash","-c","echo hello &name",因为不以bash执行则echo,只是单纯在执行echo则是什么就输出什么,不会解析变量。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于dockerfile中的关键字
    • FROM (尽量使用官方的image作为base image)
      • LABEL (类似于注释、Metadata)
        • RUN (运行命令安装软件,为了美观,复杂的RUN请用反斜线换行!避免无用分层,合并多条命令成一行!)
          • WORKDIR (用WORKDIR,不要用RUN cd,尽量使用绝对目录!)
            • ADD and COPY (大部分情况,COPY优于ADD!ADD除了COPY还有额外功能解压,添加远程文件/目录请使用curl或wget)
              • ENV (设置环境变量或常量)
                • ports(ports暴露容器端口到主机的任意端口或指定端口)
                相关产品与服务
                容器镜像服务
                容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档