使用Drone构建镜像
如何使用Gogs和Drone创建用于构建Docker映像的CI / CD流水线。
步骤1 - 配置Gogs
Gogs是一个自托管的Git服务,Drone是一个持续交付平台。它们可以建立CI/CD流水线,来构建Docker镜像。部署时,Drone服务的URL是必须的。
运行docker-compose启动两个服务
$ DRONE_HOST=https://2886795314-80-kitek05.environments.katacoda.com docker-compose up -d
Creating network "root_default" with the default driver
Creating volume "root_db-data" with local driver
Creating volume "root_gogs-data" with local driver
Pulling postgres (postgres:9.5)...
9.5: Pulling from library/postgres
62deabe7a6db: Pull complete
24c7b6331486: Pull complete
00b83e6d4b38: Pull complete
0e54c5150202: Pull complete
31dd3ef3701c: Pull complete
a7a29ab258fa: Pull complete
0d30412e41ab: Pull complete
f300ff05c105: Pull complete
6087bca444de: Pull complete
9a074670548c: Pull complete
487595f7c39d: Pull complete
317bb2885f18: Pull complete
e073a2b48253: Pull complete
d43ef7481147: Pull complete
Digest: sha256:8679e0d0658ec38b4ade78da75fcb9a249f16b5010081555186ef83c5c6fceda
Status: Downloaded newer image for postgres:9.5
Pulling gogs (gogs/gogs:latest)...
latest: Pulling from gogs/gogs
e95f33c60a64: Pull complete
6629f7b66676: Pull complete
95248f7b0231: Pull complete
1a4b11e4c1b9: Pull complete
1613ead921c8: Pull complete
37949e6160d8: Pull complete
38df9b14eb06: Pull complete
93d905b51231: Pull complete
Digest: sha256:7607fee4a463fdda91e7126fcc8504e7d972c4b80e79b2102c0de7175c1d3b81
Status: Downloaded newer image for gogs/gogs:latest
Pulling drone-server (drone/drone:0.8)...
0.8: Pulling from drone/drone
297640bfa2ef: Pull complete
6d34061bcde3: Pull complete
Digest: sha256:6056575462036f2579d17885532e5152e5478cf1c495ef183d2381a7e0cd8668
Status: Downloaded newer image for drone/drone:0.8
Pulling drone-agent (drone/agent:0.8)...
0.8: Pulling from drone/agent
297640bfa2ef: Already exists
bd501232d024: Pull complete
Digest: sha256:a46338f11e89afb1239331d8e4c22f3e44c867e1c81488314833e2d329d9ff40
Status: Downloaded newer image for drone/agent:0.8
Creating root_postgres_1 ... done
Creating root_gogs_1 ... done
Creating root_drone-server_1 ... done
Creating root_drone-agent_1 ... done
$ cat docker-compose.yml
version: '2'
services:
postgres:
image: postgres:9.5
restart: always
environment:
- "POSTGRES_USER=gogsuser"
- "POSTGRES_PASSWORD=gogspassword"
- "POSTGRES_DB=gogs"
volumes:
- "db-data:/var/lib/postgresql/data"
gogs:
image: gogs/gogs:latest
restart: always
ports:
- "10022:22"
- "3000:3000"
links:
- postgres
environment:
- "RUN_CROND=true"
volumes:
- "gogs-data:/data"
depends_on:
- postgres
drone-server:
image: drone/drone:0.8
ports:
- 80:8000
- 9000
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
links:
- gogs
environment:
- DRONE_OPEN=true
- DRONE_GOGS=true
- DRONE_GOGS_URL=http://gogs:3000
- DRONE_HOST=${DRONE_HOST}
- DRONE_SECRET=SOME_RANDOM_STRING
drone-agent:
image: drone/agent:0.8
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET=SOME_RANDOM_STRING
volumes:
db-data:
driver: local
gogs-data:
driver: local
$
访问:https://2886795474-3000-frugo04.environments.katacoda.com
创建一个项目
登录
将项目打开
启动私有Docker Registry
$ docker run -p 5000:5000 -d registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:2
d89123f5355546675ff654d285009fa2856f6dfe22252698e2de88f73017f122
$
将包含Dockerfile的项目下载下来
$ git clone https://github.com/katacoda/golang-http-server && cd golang-http-server
Cloning into 'golang-http-server'...
remote: Enumerating objects: 82, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 82 (delta 0), reused 1 (delta 0), pack-reused 78
Unpacking objects: 100% (82/82), done.
Checking connectivity... done.
$
修改仓库地址并推送上去
$ cat .drone.yml
pipeline:
build:
image: plugins/docker
repo: docker-http-server
tags:
- 1.0.0
- 1.0
- latest
$ sed -i 's|docker-http-server|2886795292-5000-elsy02.environments.katacoda.com/test/docker-http-server|g' .drone.yml
$ git remote add gogs http://test:test@2886795292-3000-elsy02.environments.katacoda.com/test/docker-http-server.git && \
> git commit -am 'Updated Repo Path' && \
> git push gogs master
[master fd414fe] Updated Repo Path
1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 40, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (40/40), 1.60 MiB | 0 bytes/s, done.
Total 40 (delta 15), reused 0 (delta 0)
To http://test:test@2886795292-3000-elsy02.environments.katacoda.com/test/docker-http-server.git
* [new branch] master -> master
$
这个push会触发Drone构建,查看流水线状态
$ curl 2886795292-5000-elsy02.environments.katacoda.com/v2/_catalog
{"repositories":["test/docker-http-server"]}
$ curl 2886795292-5000-elsy02.environments.katacoda.com/v2/test/docker-http-server/tags/list
{"name":"test/docker-http-server","tags":["latest","1.0.0","1"]}
$
clone与build完毕,自动将构建好的镜像上传到Private Docker Registry里
运行容器
$ docker run -d -p 8080:80 2886795292-5000-elsy02.environments.katacoda.com/test/docker-http-server
Unable to find image '2886795292-5000-elsy02.environments.katacoda.com/test/docker-http-server:latest' locally
latest: Pulling from test/docker-http-server
d1426d011624: Pull complete
dff425fdcaca: Pull complete
ac2d6c278079: Pull complete
1260ddb729fc: Pull complete
229cfa4694f2: Pull complete
c2bc20ef576d: Pull complete
9f99ecd91c16: Pull complete
1197308fa1ab: Pull complete
465ddf26975a: Pull complete
8fb177b04b86: Pull complete
Digest: sha256:8027befe619d5501e2fb23126beb502591b73304cb494000d022e3b7b397b6b1
Status: Downloaded newer image for 2886795292-5000-elsy02.environments.katacoda.com/test/docker-http-server:latest
017b9c2e647160d147f3d4f7fa9c5ac1c937d1aa7cf8d0050412281f39cbea5c
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
017b9c2e6471 2886795292-5000-elsy02.environments.katacoda.com/test/docker-http-server "/app/main" 16 seconds ago Up 14 seconds 0.0.0.0:8080->80/tcp sharp_elbakyan
7cf2383aea37 registry:2 "/entrypoint.sh /etc…" 5 minutes ago Up 4 minutes 0.0.0.0:5000->5000/tcp quirky_turing
c7e0fb7d00d1 drone/agent:0.8 "/bin/drone-agent ag…" 9 minutes ago Up 9 minutes (healthy) 3000/tcp root_drone-agent_1
2d9d411a425b drone/drone:0.8 "/bin/drone-server" 9 minutes ago Up 9 minutes 80/tcp, 443/tcp, 0.0.0.0:80->8000/tcp, 0.0.0.0:32768->9000/tcp root_drone-server_1
3d61b6fbb34e gogs/gogs:latest "/app/gogs/docker/st…" 9 minutes ago Up 9 minutes 0.0.0.0:3000->3000/tcp, 0.0.0.0:10022->22/tcp root_gogs_1
1a5723f2a863 postgres:9.5 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 5432/tcp root_postgres_1
$ curl localhost:8080
<h1>This request was processed by host: 017b9c2e6471</h1>
$