跳转至

docker commit

docker commit 命令允许用户将当前运行的容器状态保存为一个新的 Docker 镜像。这个命令非常有用,尤其是在需要快速创建自定义镜像的场景中。通过 docker commit,用户可以捕获容器的当前文件系统状态、配置和元数据,并将其保存为一个新的镜像,以便后续使用或共享。

  • docker commit 用于将运行中的容器保存为一个新的镜像。
  • 支持对容器的文件系统、配置和元数据进行快照保存。
  • 生成的镜像可以用于后续的容器启动或共享。

使用 容器 创建一个新的 镜像

可以将运行容器的文件更改或设置提交到新的镜像中。例如可以通过 SHELL 来调试容器,或将工作数据集导出到另一台服务器。

通常情况下,建议使用 Dockerfile 的方式来管理和构建镜像。

注意:

docker commit 提交创建的容器中不包含容器内挂载出来的 volume 卷中数据。

使用场景

  1. 快速创建自定义镜像:在某些情况下,用户可能需要在容器内进行一些临时修改,并希望将这些修改保存为一个新的镜像。使用 docker commit 可以快速实现这一目标,而无需从头编写 Dockerfile。

  2. 调试或测试:在调试或测试过程中,用户可能需要保存容器的当前状态以便后续分析。docker commit 可以帮助用户快速保存容器的当前状态,生成一个新的镜像,以便在需要时重新启动容器进行分析。

  3. 临时修改保存:在容器内进行临时修改后,用户可能希望将这些修改保存为一个新的镜像。docker commit 可以帮助用户快速生成一个新的镜像,以保留这些修改内容。

命令语法

docker commit 命令的基本语法如下:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • 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

注意事项

  1. 生成的镜像可能包含不必要的临时文件或敏感数据:在使用 docker commit 时,生成的镜像可能包含容器内的临时文件或敏感数据。因此,在使用该命令时需谨慎,确保生成的镜像不包含不必要的或敏感的信息。

  2. 提交的镜像不会自动推送到远程仓库:使用 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 进行构建。