docker - gitlab-runner 执行作业时如何避免与当前容器的端口冲突
问题描述
我正在尝试使用 gitlab-runner 部署我的应用程序。
这是 .gitlab-ci.yml 脚本:
stages:
- build
- deploy
image: docker:20
variables:
IMAGE_NAME: front:$CI_COMMIT_REF_NAME
build:
stage: build
when: manual
script:
- docker build -t $IMAGE_NAME .
- docker run -dp 80:80 $IMAGE_NAME
only:
- master
- tags
tags:
- front
第一次执行后一切都很好,我的应用程序有一个正在运行的容器。但是在下一个作业执行时我收到错误:
$ docker run -dp 80:80 $IMAGE_NAME
956d5a27449df0d38db357256fb96cf8cab8ba689d05fda21e54552bbe93fb7a
docker: Error response from daemon: driver failed programming external connectivity on endpoint frosty_elion (d89b1f150968331727a7c00823c28f3ab6a80f7882d659fce3520834005ad197): Bind for 0.0.0.0:80 failed: port is already allocated.
Cleaning up file based variables
ERROR: Job failed: exit code 125
问题:如何避免与仍在使用所需端口的运行容器发生冲突?
这是 gitlab-runner config.toml:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "name"
url = "url"
token = "token"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
shm_size = 0
解决方案
构建脚本不会自动清理您正在运行的容器。您需要确保容器按如下方式停止:
build:
stage: build
when: manual
script:
- docker build -t $IMAGE_NAME .
- (docker stop test_deployment_80 || true)
- docker run -dp --rm --name test_deployment_80 80:80 $IMAGE_NAME
only:
- master
- tags
tags:
- front
在这里,我将其添加--rm
到容器中,以便告诉docker
容器在停止时将其移除。另外,我添加--name
了运行容器的可识别名称。在启动新容器之前,我使用上一个命令中的名称来停止容器。
推荐阅读
- java - 编写镶木地板文件时出现问题
- javascript - 从表单数据创建条形码
- jquery - 悬停jQuery上的图像替换
- excel - VBA 代码运行缓慢(.copy and paste special)
- performance - 如何解决 #1452 - 无法添加或更新子行:外键约束失败
- python - 是否有一种优雅的方法可以通过 Fabric2 中的不同任务传递全局变量
- kubernetes - 即使设置了 RBAC 权限,Kubernetes 也会返回 Forbidden
- wordpress - Woocommerce Paypal 订单状态未更改
- scala - 当 foldLeft 应用于 dataFrame 时如何理解输出数据?
- python - 如何与kombu中的任何消费者建立数据库连接(psycopg2)?