这可能在某个时候被问过,但我在任何地方都找不到。我似乎无法(或无法弄清楚如何)将更改提交到 docker 映像,而不会丢失我正在提交的容器中的文件更改。这是我的用例。我在 Windows 上使用 Boot2Docker,
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8
我从 dockerHub 中提取了最新版本的 jenkins。
docker pull jenkins
我运行它,重新路由它的网络接口端口
docker run -dt -p 8010:8080 jenkins
我去界面安装一些插件。我安装插件,然后重新启动 Jenkins。然后我尝试提交我的更改。
docker commit $(docker ps -lq) <my_user_name_on_docker_hub>/<name_of_the_new_image>
docker ps -lq 返回最后一个运行容器的 id。由于此时我只运行这个容器,所以我确定这会返回正确的 id(我还通过执行 docker ps 并实际查找容器来检查它)然后我推送更改。
docker push <my_user_name_on_docker_hub>/<name_of_the_new_image>
推送会遍历 dockerHub 上已经存在的所有修订并跳过它们,直到到达最后一个并将 4 MB 上传到注册表。然而,当我尝试运行这个新映像时,它只是 jenkins 的基本映像,没有任何更改。没有我安装的插件。据我了解,应该提交对图像联合文件系统的更改(jenkins 插件作为二进制文件安装在那里)。我需要一个带有我更改的新图像。
我究竟做错了什么?
编辑:我创建了几个测试作业,运行它们,使用 docker exec -it bash 遍历文件系统,jenkins 在 /var/jenkins_home/jobs 下为每个作业创建一个新目录,但是当我执行 docker diff 时,它显示只创建了临时文件。在提交、推送、停止容器并从刚刚推送的映像中运行一个新容器之后,作业文件夹与其他所有内容一起消失。
EDIT2:我尝试在其他文件夹中创建文件,除了 /var/jenkins_home/ 目录之外,docker diff 似乎在其他任何地方都看到了变化。
EDIT3:这似乎是相关的——来自Jenkins DockerHub 页面
如何使用此图像
docker run -p 8080:8080 jenkins 这会将工作空间存储在 /var/jenkins_home 中。所有 Jenkins 数据都保存在那里——包括插件和配置。您可能希望将其设为持久卷:
docker run --name myjenkins -p 8080:8080 -v /var/jenkins_home jenkins “myjenkins”命名容器的卷将是持久的。
您还可以从主机绑定挂载到卷中:
首先,确保容器中的 jenkins 用户可以访问 /your/home(jenkins 用户 - 通常为 uid 102 - 或使用 -u root),然后:
docker run -p 8080:8080 -v /your/home:/var/jenkins_home jenkins
我尝试使用 -v 切换运行命令,但这并没有真正使我的提交更加持久。