如何在容器中(jenkins容器)運行docker命令

Docker Linux UNIX 阿爾派汽車 docker技術文摘 2017-04-25

如何在容器中(jenkins容器)運行docker命令

首先,不要在 Docker 容器中安裝、運行 Docker 引擎,也就是所謂的 Docker In Docker (DIND),參考文章:

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

為了讓容器內可以構建鏡像,應該使用 Docker Remote API 的客戶端來直接調用宿主的 Docker Engine。可以是原生的 Docker CLI (docker 命令),也可以是其它語言的庫.

(https://docs.docker.com/engine/reference/api/remote_api_client_libraries/)

為 Jenkins 添加 Docker 命令行

下面以定製 jenkins 鏡像為例,使用 Dockerfile 添加 docker 命令行可執行文件,並調整權限。

FROM jenkins:alpine

# 下載安裝Docker CLI

USER root

RUN curl -O https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz \

&& tar zxvf docker-latest.tgz \

&& cp docker/docker /usr/local/bin/ \

&& rm -rf docker docker-latest.tgz

# 將 `jenkins` 用戶的組 ID 改為宿主 `docker` 組的組ID,從而具有執行 `docker` 命令的權限。

ARG DOCKER_GID=999

USER jenkins:${DOCKER_GID}

在這個例子裡,我們下載了靜態編譯的 docker 可執行文件,並提取命令行安裝到系統目錄下。然後調整了 jenkins 用戶的組 ID,調整為宿主 docker 組ID,從而使其具有執行 docker 命令的權限。

組 ID 使用了 DOCKER_GID 參數來定義,以方便進一步定製。構建時可以通過 --build-arg 來改變 DOCKER_GID 的默認值,運行時也可以通過 --user jenkins:1234 來改變運行用戶的身份。

這裡的基礎鏡像使用的是 jenkins:alpine,換為非 alpine 的鏡像 jenkins:latest 也是一樣的。

用下面的命令來構建鏡像(假設鏡像名為 jenkins-docker):

$ docker build -t jenkins-docker .

如果需要構建時調整 docker 組 ID,可以使用 --build-arg 來覆蓋參數默認值:

$ docker build -t jenkins-docker --build-arg DOCKER_GID=1234 .

在啟動容器的時候,將宿主的 /var/run/docker.sock 文件掛載到容器內的同樣位置,從而讓容器內可以通過 unix socket 調用宿主的 Docker 引擎。

比如,可以用下面的命令啟動 jenkins:

$ docker run --name jenkins \

-d \

-p 8080:8080 \

-v /var/run/docker.sock:/var/run/docker.sock \

jenkins-docker

在 jenkins 容器中,就已經可以執行 docker 命令了,可以通過 docker exec 來驗證這個結果:

$ docker exec -it jenkins sh

/ $ id

uid=1000(jenkins) gid=999(ping) groups=999(ping)

/ $ docker version

Client:

Version: 1.12.3

API version: 1.24

Go version: go1.6.3

Git commit: 6b644ec

Built: Wed Oct 26 23:26:11 2016

OS/Arch: linux/amd64

Server:

Version: 1.13.0-rc2

API version: 1.25

Go version: go1.7.3

Git commit: 1f9b3ef

Built: Wed Nov 23 06:32:39 2016

OS/Arch: linux/amd64

/ $

相關推薦

推薦中...