phymooc / learn-docker

0 stars 0 forks source link

DockerFile #7

Open phymo opened 3 years ago

phymo commented 3 years ago

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

phymo commented 3 years ago

CMD service nginx start 然后发现容器执行后就立即退出了

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。 而使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。 CMD ["nginx", "-g", "daemon off;"] 正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行

phymo commented 3 years ago

https://yeasy.gitbook.io/docker_practice/appendix/best_practices Dockerfile 最佳实践 和 常用命令

phymo commented 3 years ago
docker build [OPTIONS] PATH | URL | - 
docker build . # 自动找到当前目录下的dockerfile 构建 image
options:
 --tag, -t  # 给image 打 tag; 格式: name:tag
 --rm #  Remove intermediate containers after a successful build 默认为true

常见指令:

FROM

FROM <IMAGE>:<TAG> # 通过FROM指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,必须位于第一条非注释指令

RUN

用于指定构建镜像时运行的命令,两种模式:

RUN <command> (shell模式) # 在shell模式下,是使用/bin/sh -c COMMAND来运行命令的 (不要用)
RUN [ "executable", "param1", "param2" ] (exec模式) # 在exec模式下可以指定其他的shell来运行命令RUN [“/bin/bash”, “-c”, “echo hello”] (推荐, 可以保证进程的前台运行)

best practice: 多条RUN 应该用 && 合并为一条,这样能减少构建时产生的中间镜像

EXPOSE

指定运行该镜像的容器使用的端口,可以是多个。

EXPOSE <PORT>

使用这个指令的目的是告诉应用程序容器内应用程序会使用的端口,在运行时还需要使用-p参数指定映射端口。这是docker处于安全的目的,不会自动打开端口。 这个并没有任何实际的作用,只是声明端口,告诉image的使用者

CMD vs ENTRYPOINT

两者都是用于提供容器运行时的默认命令

  1. CMD
    CMD <command> (shell模式)
    CMD [ "executable", "param1", "param2" ] (exec模式)
    CMD [ 'param1', 'param2'] (通常与ENTRYPOINT搭配指定ENTRYPOINT的默认参数)
  2. ENTRYPOINT
ENTRYPOINT <command> (shell模式)
ENTRYPOINT [ "executable", "param1", "param2" ] (exec模式)

区别

多个CMD 指令,只有最后一条有效, 而且 docker run 时指定的命令会覆盖 CMD指令 ENTRYPOINT不会被docker run中指定的命令覆盖,如果想覆盖ENTRYPOINT,则需要在docker run中指定--entrypoint选项

为什么我的容器刚启动就退出 配合使用例子:

ENTRYPOINT ['ping']
CMD ['localhost']

docker run -it container 'baidu.com'

ADD vs COPY


ADD <src> <dest>
ADD ["<src>" "<dest>"] (适用于文件路径包含空格的情况)

COPY COPY ["" ""] (适用于文件路径包含空格的情况)

> ADD包含了类似tar的解压功能,如果只是单纯复制文件,建议使用COPY,而且,两者的源文件路径使用Dockerfile相对路径,目标路径使用绝对路径

## VOLUME
用于向容器添加卷,可以提供共享存储等功能

VOLUME ['/data']


## WORKDIR
在容器内部设置工作目录,这样ENTRYPOINT和CMD指定的命令都会在容器中这个目录下进行。
## ENV
用于设置环境变量

ENV ENV =


## USER ONBUILD

## Dockerfile的构建过程
1. docker会从Dockerfile文件头FROM指定的基础镜像运行一个容器
2. 然后执行一条指令,对容器修改
3. 接着执行类似docker commit的操作,创建新的镜像层
4. 在基于刚创建的镜像运行一个新的容器
5. 执行Dockerfile下一条指令,直到所有指令执行完毕

> docker会删除中间层创建的容器,但不会删除中间层镜像,所以可以使用docker run运行一个中间层容器,从而查看每一步构建后的镜像状态,这样就可以进行调试。

## MULT STAGE BUILD
> 两个 FROM. 最终image只包含最后一个 FROM的 层