DockerFile的编写和注意的一些知识点

简介: CMD,RUN,ENTRYPOINT之类的差别。 VOLUMN和-V之间的差别。 EXPOSE和-P的对应等。 今天上午写了一个脚本,可以传参数进IMAGE,让启动的CONTAINER具有不同的行为。

CMD,RUN,ENTRYPOINT之类的差别。

VOLUMN和-V之间的差别。

EXPOSE和-P的对应等。

今天上午写了一个脚本,可以传参数进IMAGE,让启动的CONTAINER具有不同的行为。

另外是一些常用的方便命令:

删除所有正在运行的容器(先停止,再删除)。

docker stop $(docker ps -q) && docker rm $(docker ps -a -q)

启动镜像(包括端口映射,目录挂载-如果windows,那不是挂windows目录,是虚拟机目录,命令容器,传递参数)

docker run -p 8889:80 -v /applog:/var/log/nginx --name testprism333 prism3  -e PRD

 

=============================

如果在Dockerfile中同时写了entrypoint和cmd,docker在build过程中会将cmd中指定的内容作为entrypoint的参数。

那么如果,我们希望每个容器都固定的执行一个config脚本,然后再运行特定的程序时,利用entrypoint和cmd可以如何做到呢?从上述分析可以很自然的想到,将entrypoint解析CMD参数,并以命令执行。

CMD命令的参数格式,一般写成 字符串数组的方式,如上面的例子。如:

CMD  ["echo","hello world"]

虽然也可写成CMD echo hello word 方式,但这样docker会在指定的命令前加  /bin/sh -c 执行,有时有可能会出问题。 所以推荐采用数据结构的方式来存放命令。

dockerfile 中的 ENTRYPOINT 和 CMD

看似一样,都是实现 container 启动命令,但是需要注意:

1、都有两种方式,数组方式,以及 shell 方式

?
1
2
[ "sh" , "-c" , "echo hello" ]
sh -c 'echo hello'

2、ENTRYPOINT 除了指定 container 入口之外,更重要的作用是: 通过它可以让一个 container 像一个 executable 一样。比如

?
1
ENTRYPOINT ["/bin/sh"]

之后 build 出来的镜像就像一个 sh 程序文件一样,运行该 image,就像运行 sh 程序。

3、如果 ENTRYPOINT 指定了,并且采用了数组方式,即 ["exectable", "para1", "para2"] ,那么 CMD 指定的内容会被视为 ENTRYPOINT 数组中最后的一个参数

4、如果 ENTRYPOINT 使用 shell 方式,那么它会覆盖所有的 CMD 以及 docker run 后面指定的 command

5、docker run 后面指定的 command 会取代 CMD 的内容

=============================

From nginx

MAINTAINER Prism DevOps@pxx.com.cn

WORKDIR /usr/local/nginx/html

ENV NGINX_ROOT_DIR /usr/local/nginx/html

VOLUME ["/applog", "/data"]

RUN mkdir -p /var/devops/

COPY bootstart.sh /var/devops/bootstart.sh

ENTRYPOINT ["/bin/bash", "/var/devops/bootstart.sh"]

CMD ["-h"]
#!/bin/bash

# description: dockerfile function depend on CMD and ENTRYPOINT arg
# author: chngjun855
# version alpha
# date 2017-05-18

# get args
while getopts "e:i:g:h" arg
do
  case $arg in
    e)
      env=$OPTARG
      ;;
    i)
      ipaddr=$OPTARG
      ;;
    g)
      group=$OPTARG
      ;;
    h)
      echo "/bin/bash bootstart.sh -e [ENV] -i [ipaddress] -g [group]"
      ;;
    ?)
      echo "unknow argument, -e -i -g"
      exit 1
  esac
done

echo "env is $env"
echo "ipaddr is $ipaddr"
echo "group is $group"

# different function depend on different env arg
case $env in
  FAT)
    echo "FAT html page" > /usr/share/nginx/html/test.html
    ;;
  UAT)
    echo "UAT html page" > /usr/share/nginx/html/test.html
    ;;
  PRD)
    echo "PRD html page" > /usr/share/nginx/html/test.html
    ;;
esac

nginx -g "daemon off;"

目录
相关文章
|
2月前
|
Ubuntu Shell 应用服务中间件
|
6月前
|
Shell Docker 容器
dockerfile编写和构建运行
dockerfile编写和构建运行
|
9天前
|
安全 Java Maven
编写 Dockerfile 最佳实践
编写 Dockerfile 最佳实践
|
4月前
|
存储 Linux 开发工具
Python 进阶指南(编程轻松进阶):十二、使用 Git 组织您的代码项目
Python 进阶指南(编程轻松进阶):十二、使用 Git 组织您的代码项目
55 0
|
9月前
|
安全 开发工具 git
|
存储 缓存 持续交付
Dockerfile 文件是干什么的?底层原理是什么?
Dockerfile 文件是干什么的?底层原理是什么?
592 0
Dockerfile 文件是干什么的?底层原理是什么?
|
缓存 网络协议 Linux
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
EXPOSE指令告诉Docker容器在运行时监听指定的网口。可以指定端口侦听的协议类型是TCP还是UDP,如果不指定协议类型,默认为TCP。
301 0
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
|
安全 开发工具 git
常用的一些Git命令进阶用法
常用的一些Git命令进阶用法
105 0
|
前端开发 JavaScript Java
Docker 极简入门教程,傻瓜都能看懂!
Docker 极简入门教程,傻瓜都能看懂!
451 0
Docker 极简入门教程,傻瓜都能看懂!
|
运维 应用服务中间件 Linux
DockerFile知识点与运用
DockerFile知识点与运用
87 0
DockerFile知识点与运用