dockerfile学习笔记

Dockfile

参考资料:http://www.cnblogs.com/CloudMan6/p/6864000.html

http://www.cnblogs.com/CloudMan6/p/6875834.html

http://www.docker.org.cn/article/114.html

http://www.cnblogs.com/sparkdev/p/6357614.html

http://cloud.51cto.com/art/201411/457338.htm

http://blog.csdn.net/allocator/article/details/70490218

Dockerfile中multi-stage:https://www.jb51.net/article/136260.htm
需要注意的是旧版本的 docker 是不支持 multi-stage 的,只有 17.05 以及之后的版本才开始支持

1、 FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始;如果FROM语句没有指定镜像标签,则默认使用latest标签

2、CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。

CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

3、 CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了

4、 每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。ENTRYPOINT配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run --entrypoint选项。

5、 Export告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。

6、 Env指定一个环节变量,会被后续RUN指令使用,并在容器运行时保留.

7、 ADD <src> <dest> 将复制指定的 <src> 到容器中的 <dest>。其中 <src> 可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。当使用本地目录为源目录时,推荐使用 COPY

8、 COPY用法同ADD,唯一的不同是不能指定远程文件 URLS。

9、 Valume 创建一个可以从本地主机或其他容器挂载的挂载点

10、            使用一个.dockerignore文件用来排除构建镜像时不需要的文件或目录

11、            在大多数情况下,一个容器应该只单独跑一个程序。使其更容易横向扩展和重用

12、            为保持可读性、方便理解、可维护性,把长或者复杂的RUN语句使用分隔符分成多行

13、            镜像构建过程中会按照Dockerfile的顺序依次执行,每执行一次指令 Docker 会寻找是否有存在的镜像缓存可复用,如果没有则创建新的镜像。如果不想使用缓存,则可以在docker build时添加--no-cache=true选项

14、            为了有效地利用缓存,你需要保持你的 Dockerfile 一致,并且尽量在末尾修改。

15、            Dockerfile 的第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令

16、            Docker build命令将读取指定路径下(包括子目录)的 Dockerfile ,并将该路径下所有内容发送给 docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。

17、            可以通过 .dockerignore 文件来让 docker 忽略路径下的目录和文件

18、             

                       

指定 Dockerfile 所在路径为 /tmp/docker_builder/,并且希望生成镜像标签为 build_repo/first_image

19、            "docker build -t nginx-centos:6.7 ." 其中.表示在当前目录下搜索Dockerfile文件,-t参数指定镜像名称和tag

20、            myTest

21、   ENTRYPOINT command param1 param2(shell中执行)。

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用     

FROM  hub.windinfo.cn/baselib/pandoc:latest
MAINTAINER      yalasuo

RUN             mkdir /qh_doc
COPY          .   /qh_doc

RUN          chmod u+x /qh_doc/docs/scripts/build.sh
WORKDIR        /qh_doc/docs
ENTRYPOINT ["bash"]
CMD        ["./scripts/build.sh"]

=============docker entrypoint入口文件详解

https://www.cnblogs.com/breezey/p/8812197.html

几乎在每个docker-entrypoint.sh脚本的最后一行, 执行的都是 exec "$@"命令

这个命令的意义在于你已经为你的镜像预想到了应该有的调用情况, 当实际使用镜像的人执行了你没有预料到的可执行命令时, 将会走到脚本的这最后一行, 去执行用户新的可执行命令 

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

  1. 使用 RUN 指令安装应用和软件包,构建镜像。

  2. 如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。

  3. 如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令

=================================https://www.cnblogs.com/spec-dog/p/11570394.html

1 docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context
–no-cache 表示镜像构建时不使用缓存,-f 指定Dockerfile文件位置, context 指定build context目录

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建指令中指定–no-cache参数,如:docker build --no-cache

2 推荐使用Alpine镜像作为基础镜像,因为它足够轻量级(小于5MB),但麻雀虽小五脏俱全,基本具有Linux的基础功能
3 将比较长的复杂的指令通过 分为多行,让Dockerfile文件可读性、可理解性、可维护性更高,将多个指令通过 && 连接,减少镜像的层数
4 将RUN apt-get update 与 RUN apt-get install 组合成一条RUN指令(将apt-get update单独作为一条指令会因为缓存问题导致后续的apt-get install 指令失败)
5 在 multistage 的用法中,可以使用 COPY 命令把前一阶段构建的产物拷贝到另一个镜像中
5 ADD与COPY的使用格式与性质差不多,但功能更丰富,如源路径可以是URL(下载后放到目标路径下,文件权限为600),也可以为tar压缩包,压缩格式为gzip,bzip2及xz的情况下,ADD 指令将会自动解压缩这个压缩文件到目标路径去
6 因为镜像大小的原因, 使用ADD来获取远程包是非常不推荐的,原因是当使用 ADD 命令时,会创建更多的镜像层,当然镜像的 size 也会更大,应该使用curl或wget,这种方式可以在不再需要使用时删除对应文件,而不需要增加额外的层,
如,应避免如下用法
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

而应使用

RUN mkdir -p /usr/src/things 
    && curl -SL http://example.com/big.tar.xz 
    | tar -xJC /usr/src/things 
    && make -C /usr/src/things all

# shell格式
CMD <命令>
# exec格式
CMD ["可执行文件", "参数1", "参数2"...]
# 参数列表格式,在指定了ENTRYPOINT指令后,用CMD来指定具体的参数
CMD ["参数1", "参数2"...]

8  如果指定了ENTRYPOINT,则CMD将只是提供参数,传递给ENTRYPOINT

9 CMD 指令用来在启动容器的时候,指定默认的容器主进程的启动命令和参数

CMD echo 1
CMD ["npm", "run", "test"]   必须是双引号

第一种执行的命令会被包装程,CMD [ "sh", "-c", "echo 1" ] JSON 数组形式,一般推荐 JSON 数组形式。

CMD 后面的命令是容器每次启动执行的命令,多个命令之间可以使用 && 链接,例如 CMD git pull && npm start

10 容器中的应用都应该以前台执行,而不是启动后台服务,容器内没有后台服务的概念。

11 如果目录下有些东西确实不希望构建时传给 Docker引擎,那么可以用.gitignore 一样的语法写一个 .dockerignore。

12 我们只需要定义一个 YAML 格式的配置文件(docker-compose.yml),来编写一个项目所需要的多个容器配置及调用关系,通过简单的命令即可同时开始或者关闭这些容器。Compose 定位是定义和运行多个 Docker 容器的应用。

13 

  1. docker pull [镜像名称:版本] 拉取镜像

  2. docker images 镜像列表

  3. docker rmi [镜像名称:版本] 删除镜像

  4. docker history [镜像名称] 镜像操作记录

  5. docker tag [镜像名称:版本][新镜像名称:新版本]

  6. docker inspect [镜像名称:版本] 查看镜像详细

  7. docker search [关键字] 搜索镜像

  8. docker login 镜像登陆

14 

  1. docker ps -a 容器列表(所有容器)

  2. docker ps 查看所有(运行的)容器

  3. docker exec -ti <id> bash bash 命令进入容器内

  4. docker run -ti --name [容器名称][镜像名称:版本] bash 启动容器并进入

  5. docker logs 查看容器日志

  6. docker top <container_id> 查看容器最近的一个进程

  7. docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash 端口映射

  8. docker rm <container_id> 删除容器

  9. docker stop <container_id> 停止容器

  10. docker start <container_id> 开启容器

  11. docker restart <container_id> 重启容器

  12. docker inspect <container_id> 查看容器详情

  13. docker commit [容器名称] my_image:v1.0 容器提交为新的镜像

15 

如下是dockerfiel示例,使用了环境变量 ENV

FROM python:3.6-slim
RUN mkdir -p /app
ENV APP_HOME /app
COPY src $APP_HOME
WORKDIR $APP_HOME
ENTRYPOINT ["python", "validate.py"]
原文地址:https://www.cnblogs.com/testzcy/p/7199853.html