如何在 Docker 启动的 Jenkins 容器中支持 Docker Compose 功能?

阅读 1.4k
avatarAI BotBETA
要在 Docker 启动的 Jenkins 容器中支持 Docker Compose 功能(特别是 Docker Compose V2,即 `docker compose` 命令),你需要执行以下步骤:

1. **安装 Docker Compose V2 CLI**:
   Jenkins 容器内部需要安装 Docker Compose V2 的 CLI 工具。你可以通过 Dockerfile 或者在 Jenkins 启动后手动安装 Docker Compose V2。Docker Compose V2 的安装指南可以参考官方文档:[Install Docker Compose](https://docs.docker.com/compose/cli-command-notary/#install-on-linux)。

2. **配置 Docker Socket**:
   Jenkins 容器需要访问 Docker 的 Unix Socket(通常是 `/var/run/docker.sock`)以便能够管理 Docker 容器。在启动 Jenkins 容器时,你需要通过 `-v /var/run/docker.sock:/var/run/docker.sock` 参数将宿主机的 Docker Socket 挂载到 Jenkins 容器内。

3. **安装 Docker CLI Plugin(可选但推荐)**:
   在 Jenkins 中安装 Docker CLI Plugin 可以更方便地管理 Docker 命令,尽管这不是直接使用 `docker compose` 命令的必需条件,但它可以增强 Docker 管理的灵活性。

4. **配置 Jenkins Pipeline**:
   在你的 Jenkins Pipeline 脚本中,你可以直接使用 `sh` 步骤来运行 `docker compose` 命令。例如:

pipeline {

   agent any
   stages {
       stage('Build') {
           steps {
               script {
                   // 确保 docker compose 命令可用
                   sh 'docker compose --version'
                   // 运行你的 docker compose 命令
                   sh 'docker compose up -d'
               }
           }
       }
   }

}


5. **确保用户权限**:
确保 Jenkins 容器内的用户有足够的权限来访问 Docker Socket 并执行 Docker Compose 命令。这通常意味着你可能需要以 root 用户身份运行 Jenkins 或者适当调整 Docker Socket 的权限。

通过上述步骤,你应该能够在 Docker 启动的 Jenkins 容器中成功使用 Docker Compose V2 功能。
1 个回答

看了一下那篇文章,按照文章的做法大概就是不支持的。 但是要支持的话也有办法。

因为新的版本的 docker ,是把 compose 作为插件在运行的。docker-compose 并不是直接集成在 docker 这个命令里面。

通过 docker info 可以看到插件所在的目录。

root@opsv:/run/containerd# docker info
Client: Docker Engine - Community
 Version:    27.5.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.19.3
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.32.4
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

在你贴出来的文章里面,运行jenkins的时候,只挂载了这两个文件

- '/usr/bin/docker:/usr/bin/docker'
- '/var/run/docker.sock:/var/run/docker.sock'

所以在容器里面执行的时候,docker 相当于没有安装 docker-compose 插件。

解决的话,只需要再加一个挂载。

 - '/usr/bin/docker:/usr/bin/docker'
 - '/var/run/docker.sock:/var/run/docker.sock'
 - '/usr/libexec/docker/cli-plugins/docker-compose:/usr/libexec/docker/cli-plugins/docker-compose' 
 #这里的文件目录参考你的 docker info 显示的插件目录
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题