2

这可能在某个时候被问过,但我在任何地方都找不到。我似乎无法(或无法弄清楚如何)将更改提交到 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 切换运行命令,但这并没有真正使我的提交更加持久。

4

1 回答 1

1

没有查看 Jenkins docker 镜像的文档是我的错

如何使用此图像

docker run -p 8080:8080 jenkins 这会将工作空间存储在 /var/jenkins_home 中。所有 Jenkins 数据都保存在那里——包括插件和配置。您可能希望将其设为持久卷:

docker run --name myjenkins -p 8080:8080 -v /var/jenkins_home jenkins “myjenkins”命名容器的卷将是持久的。

https://registry.hub.docker.com/_/jenkins/

于 2015-02-23T09:44:25.803 回答