我有以下设置:
第一台机器。带有Github集成的Docker服务器。
第二台机器。使用docker-agent进行生产,该过程以这种方式启动:
docker run -d
-e DRONE_SERVER=<ip:host>
-e DRONE_SECRET=<secret>
-v /var/run/docker.sock:/var/run/docker.sock
--restart=always
--name=drone-agent
drone/agent:0.8 agent
回购以下.drone.yml:
pipeline:
run:
image: docker/compose:1.21.2
commands:
- cd <dir_with_docker-compose.yml>
- docker-compose up -d <service_name>
volumes:
- /var/run/docker.sock:/var/run/docker.sock
when:
branch: [<branch_name>]
因此,当我使用此.drone.yml触发构建时,得到以下输出:
cd <dir_with_docker-compose.yml>
docker-compose up -d <service_name>
Starting docker_<service_name>_1 ...
Starting docker_<service_name>_1 ... error
ERROR: for docker_<service_name>_1 Cannot start service <service_name>: driver failed programming external connectivity on endpoint docker_<service_name>_1
(<hash>): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
ERROR: for <service_name> Cannot start service <service_name>: driver failed programming external connectivity on endpoint docker_<service_name>_1
(<hash>): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
Encountered errors while bringing up the project.
但是,如果我在docker ps
和netstat -tulpn
之间插入cd <dir_with_docker-compose.yml>
或docker-compose up -d <service_name>
,服务将成功启动。
为什么会这样?
答案 0 :(得分:0)
该错误消息表示该端口已在使用其他端口。由于该端口似乎是80,因此我猜您正在运行Web服务器。有很多方法可以确定正在使用端口的程序(如果它是docker容器,docker ps -a
应该显示给您),我将尝试其中一种并关闭有问题的进程,然后尝试再次启动您的docker系统。如果错误消失了,那么您已经找到了罪魁祸首。
我不知道您的docker映像中到底有什么,但也可能是它们彼此冲突。我相信Docker会自动为图像分配一个随机的空闲端口,但前提是未指定端口。因此,如果程序集中的多个容器都试图绑定80,那将是一个问题。我会仔细检查您的Dockerfile和docker compose,看看是否有人使用80。您可以明确要求Docker使用docker run -p 12345 CONTAINER_NAME
将容器绑定到任意端口。您的运行命令中确实有-e DRONE_SERVER=<ip:host>
,但是IIRC会设置一个环境变量,因此Docker可能会忽略您指定的端口。因此,基本上,对于您正在执行的所有运行命令,请包含一个类似-p 12345
的参数(每个容器使用不同的数字),并更改docker-compose.yml
中的端口。如果可以解决问题,请查看以前使用-p 80
运行了哪些容器,或者在docker compose中指定了端口80。
请注意,如果您不小心尝试运行相同的Docker映像两次,那么新实例当然会与旧实例冲突,因为它们都将尝试使用同一端口(除非未指定端口,在这种情况下) Docker能够自动解决冲突)。因为我看到了docker_<service_name>_1
(特别是_1
),所以我怀疑您已经完成了此设置的docker-compose run
,却忘记将其删除并重新运行。基本上,您应该关闭所有与此docker compose相关的容器并将其删除。像Portainer这样的GUI可能对此有所帮助。