Docker内修改代码后重新打包构建实操教程

查看容器 

列出容器的命令为:docker container ls,等价的别名为:

docker container ps
docker container list
docker ps

常用的参数说明如下:

  • -a, --all:列出所有的容器,包括停止运行的容器
  • -s, --size:显示容器的大小
  • -q, --quiet:仅显示容器ID
  • -f, --filter:过滤器,支持key=value的格式进行过滤,多个过滤器使用-f "key=value" -f "key=value"格式
  • -a列出所有容器

查找源代码位置

  • 如果容器是基于本地源代码构建的(例如,你在有Dockerfile的地方执行了docker build),那么你只需要在你的代码编辑器中打开对应的文件,进行编辑即可。
  • 如果源代码是在构建过程中复制到镜像中的,你需要找到源代码在本地的副本。查看Dockerfile中的COPYADD指令,看它们从哪里复制了文件。

如果你没有Dockerfile,但知道文件的名字或部分内容,可以进入容器内部进行搜索。使用以下命令进入容器:

docker exec -it <容器ID或名称> /bin/bash

然后使用findgrep命令搜索文件:

  • 通过文件名搜索:find / -type f -name "<文件名>"
  • 通过文件内容搜索:grep -rnw '/' -e "部分内容"

修改源代码

找到文件后,你可以直接在容器内部使用命令行文本编辑器(如vinano)进行修改。

如果提示vim找不到,则:

你可以通过 Docker 容器的包管理器来安装 vim。对于基于 Debian 或 Ubuntu 的容器,使用以下命令:

apt-get update && apt-get install vim -y

对于基于 Alpine 的容器,使用:

apk add vim

安装 vim 后,你应该能够使用它来编辑文件。

或者复制容器内文件到本地编辑:

docker cp 容器ID:/容器内文件目录/文件 /本地目录
例如:docker cp dac4ad0a4d89:/app/view/views/settings.html /root/bookmark/

修改完成后,复制文件回容器:

docker cp /本地目录/文件 容器ID:/容器内文件目录
例如:docker cp /root/bookmark/settings.html dac4ad0a4d89:/app/view/views/

重建镜像

新建镜像

修改源代码后,你需要重建Docker镜像以包含这些更改。

  1. 退出正在运行的容器,如果你是通过 docker exec 进入容器的,那么直接输入 exit 或者使用快捷键 Ctrl+D 即可。
  2. 接下来,找到你所修改容器的 ID 或名称。你可以通过 docker ps -a 命令查看当前所有容器的列表。
  3. 使用 docker commit 命令来创建一个包含了你所做更改的新镜像。下面是这个命令的基本格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  1. 执行 docker commit 命令,例如:

docker commit my_modified_container myrepo/myapp:v2.0

在这个例子中,my_modified_container 是你所修改容器的名称或 ID,myrepo/myapp 是新镜像的仓库名,v2.0 是新的标签。

  1. 你可以使用 docker images 来查看新创建的镜像。
  2. 现在,你可以基于这个新创建的镜像启动一个新容器。例如:

docker run -d -p 80:80 myrepo/myapp:v2.0

在这里,-d 表示在后台运行,-p 80:80 表示将容器的 80 端口映射到主机的 80 端口上(根据你的应用情况来决定端口映射),myrepo/myapp:v2.0 是你刚刚创建的新镜像。

请注意,这种方法将创建一个新的镜像层,它仅仅包含了容器中的更改。它不会更改原来的镜像,而是基于原始镜像和所做更改创建一个新镜像。如果你想更新原始镜像,并且持续使用相同的标签,你可以在 docker commit 命令中使用相同的镜像名和标签。但是,请意识到这将覆盖原有标签的镜像,所以请确定这是你想要的操作。

重构原镜像

提交更改:首先,确认容器中所做更改已经保存,并记录下容器的ID。然后提交这个容器为一个新的镜像,并使用相同的镜像名和标签。

docker commit <容器ID或名称> <现有镜像名>:<相同的标签>

例如,如果原始镜像名为 myapp,标签为 latest,则命令如下:

docker commit my_modified_container myapp:latest

查看镜像:执行 docker images 命令查看镜像列表,确认新的镜像已经带有旧的标签。

运行新镜像:现在,使用 docker run 命令来启动新的镜像。

然后运行新镜像:

docker run -d -p 80:80 myapp:latest

这将使得 Docker 使用 latest 标签从你的本地镜像库中拉取新提交的镜像,并启动它。

请记住,当你用新的镜像覆盖旧的标签时,旧的镜像不会被删除。它们将不再有标签关联,变成悬挂镜像(dangling images)。如果你需要清理这些旧的未标记的镜像,可以使用 docker image prune 命令。

注意:使用相同的标签覆盖现有的镜像可能会影响到所有依赖于该标签的系统和用户。如果这个镜像被推送到共享仓库,并且其他人或服务依赖于它,这可能导致不一致和混淆。确保你的团队成员或使用该镜像的任何自动化系统都意识到这个变化。通常,对于生产环境,最佳实践是使用新的标签来保留版本的不变性。