从容器构建-容器经过反复修改,但不知道具体的修改历史;不熟悉dockerfile指令
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours desperate_dubinsky
197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours focused_hamilton
$ docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4
f5283438590d
$ docker run -d svendowideit/testimage:version4
89373736e2e7f00bc149bd783073ac43d0507da250e999f3f1036e0db60817c0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89373736e2e7 testimage:version4 "apachectl -DFOREGROU" 3 seconds ago Up 2 seconds 80/tcp distracted_fermat
c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours desperate_dubinsky
197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
从dockerfile构建-了解镜像的构建步骤;熟悉dockerfile指令
docker build dockerfile
参考dockerfile官方文档
FROM
dockerfile的起点,指定镜像构建依赖的基础镜像。
LABEL
指定镜像的元数据(键值对)(比如指定作者:maintainer=xxl)。
ENV
指定环境变量,推荐键值对(key=value)的方式。
WORKDIR
指定RUN, CMD, ENTRYPOINT, COPY和ADD的工作目录,可多次设置,每次设置后对后面生效。
ADD-可以是远程文件
从源地址复制新的文件,目录或者远程文件url,并把它们添加到镜像的目标路径。
COPY-不能是远程文件
从源目录复制新的文件或者目录,并且把它们添加到容器的目标路径。
EXPOSE
指定容器运行时监听的端口,可以指定协议udp/tcp,不指定的话默认是tcp。
EXPOSE 80/udp
VOLUME
指定容器的挂载点,并把它作为宿主或者其他容器的外部挂载卷。
RUN
执行过程命令,比如创建文件夹,开启配置等,可以有多个,每个都生效。
CMD
在Dockerfile中只能有一个CMD指令。如果您列出了多个CMD,那么只有最后一个CMD将生效。CMD的主要目的是为执行容器提供默认值。这些缺省值可以包括可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一个ENTRYPOINT指令。
ENTRYPOINT
ENTRYPOINT允许您配置作为可执行文件运行的容器。docker run <image>的命令行参数将被附加在exec形式的ENTRYPOINT中的所有元素之后,并且将覆盖使用CMD指定的所有元素。这允许参数被传递到入口点,即, docker run <image> -d将把-d参数传递给入口点。可以使用docker run -entrypoint标志覆盖ENTRYPOINT指令。只有Dockerfile中的最后一个ENTRYPOINT指令才会起作用。
USER
指定镜像运行时或者执行RUN、CMD、ENTRYPOINT命令时所处的用户名和用户组。
CMD和ENTRYPOINT的区别
- Dockerfile应该指定至少一个CMD或ENTRYPOINT命令。
- 当使用容器作为可执行文件时,应该定义入口点。
- CMD应该用于为ENTRYPOINT命令定义默认参数,或者用于在容器中执行特别命令。
- 当使用替代参数运行容器时,CMD将被覆盖。
| No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”, “p1_entry”] | |
|---|---|---|---|
| No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
| CMD [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
| CMD [“p1_cmd”, “p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd |
| CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
如果CMD是从基础image定义的,设置ENTRYPOINT会将CMD重置为空值。在这个场景中,必须在当前image中定义CMD才能有一个值。
本文详细介绍了如何使用Docker构建和管理容器镜像,包括通过容器构建镜像的方法和利用Dockerfile进行镜像构建的过程。文章涵盖了Dockerfile的各个指令,如FROM、LABEL、ENV、WORKDIR、ADD、COPY、EXPOSE、VOLUME、RUN、CMD、ENTRYPOINT和USER的使用方法及区别。

5157

被折叠的 条评论
为什么被折叠?



