docker commit¶
docker commit
命令允许用户将当前运行的容器状态保存为一个新的 Docker 镜像。这个命令非常有用,尤其是在需要快速创建自定义镜像的场景中。通过 docker commit
,用户可以捕获容器的当前文件系统状态、配置和元数据,并将其保存为一个新的镜像,以便后续使用或共享。
docker commit
用于将运行中的容器保存为一个新的镜像。- 支持对容器的文件系统、配置和元数据进行快照保存。
- 生成的镜像可以用于后续的容器启动或共享。
使用 容器 创建一个新的 镜像。
可以将运行容器的文件更改或设置提交到新的镜像中。例如可以通过 SHELL 来调试容器,或将工作数据集导出到另一台服务器。
通常情况下,建议使用 Dockerfile 的方式来管理和构建镜像。
注意:
docker commit 提交创建的容器中不包含容器内挂载出来的 volume 卷中数据。
使用场景¶
-
快速创建自定义镜像:在某些情况下,用户可能需要在容器内进行一些临时修改,并希望将这些修改保存为一个新的镜像。使用
docker commit
可以快速实现这一目标,而无需从头编写 Dockerfile。 -
调试或测试:在调试或测试过程中,用户可能需要保存容器的当前状态以便后续分析。
docker commit
可以帮助用户快速保存容器的当前状态,生成一个新的镜像,以便在需要时重新启动容器进行分析。 -
临时修改保存:在容器内进行临时修改后,用户可能希望将这些修改保存为一个新的镜像。
docker commit
可以帮助用户快速生成一个新的镜像,以保留这些修改内容。
命令语法¶
docker commit
命令的基本语法如下:
CONTAINER
:指定要提交的容器名称或 ID。REPOSITORY[:TAG]
:指定生成镜像的名称和标签(可选)。
常用选项¶
-a, --author
:指定镜像的作者信息。例如:docker commit -a "John Doe" my_container my_image:latest
。-m, --message
:为提交操作添加注释信息。例如:docker commit -m "Added new configuration" my_container my_image:latest
。-p, --pause
:在提交前暂停容器(默认行为)。如果不需要暂停容器,可以使用--pause=false
。
注意事项¶
-
生成的镜像可能包含不必要的临时文件或敏感数据:在使用
docker commit
时,生成的镜像可能包含容器内的临时文件或敏感数据。因此,在使用该命令时需谨慎,确保生成的镜像不包含不必要的或敏感的信息。 -
提交的镜像不会自动推送到远程仓库:使用
docker commit
生成的镜像不会自动推送到远程仓库。如果需要将镜像推送到远程仓库,需手动使用docker push
命令。
帮助¶
$ docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
选项¶
名称,简写 | 默认值 | 描述 |
---|---|---|
--author, -a | 提交镜像的作者 | |
--change, -c | 使用 Dockerfile 指令来创建镜像,可以多次指定指令。会将 Dockerfile 说明应用于创建的镜像。支持的 Dockerfile 指令有 CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME、WORKDIR | |
--message, -m | 提交时的说明文字 | |
--pause, -p | true | 在执行 commit 时,将容器暂停。默认情况下,在提交映像时,将暂停提交的容器及其进程。这减少了在创建提交过程中遇到数据损坏的可能性,但会影响正在运行的服务。如果不希望出现这种情况,可以将 --pause 选项设置为false。 |
示例¶
使用运行中的容器提交生成一个新的镜像¶
$ 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 c3f279d17e0a svendowideit/testimage:version3
f5283438590d
$ docker images
REPOSITORY TAG ID CREATED SIZE
svendowideit/testimage version3 f5283438590d 16 seconds ago 335.7 MB
使用新的配置文件提交一个镜像¶
$ 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 inspect -f "{{ .Config.Env }}" c3f279d17e0a
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
$ docker commit --change "ENV DEBUG true" c3f279d17e0a svendowideit/testimage:version3
f5283438590d
$ docker inspect -f "{{ .Config.Env }}" f5283438590d
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true]
使用新的 CMD 和 EXPOST 提交新的镜像¶
$ 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 focused_hamilton
参考¶
https://docs.docker.com/v18.09/engine/reference/commandline/commit/
总结¶
docker commit
是一个非常有用的命令,适用于需要快速生成自定义镜像的场景。然而,由于其缺乏可重复性和版本控制,建议在生产环境中谨慎使用。对于需要长期维护的镜像,建议使用 docker build
通过 Dockerfile 进行构建。