docker-compose的”–service-ports”标志在什么情况下使用

62次阅读
没有评论

问题描述

在使用docker-compose时,看到了docker-compose run命令的参考文档中提到了--service-ports标志。但是,文档中的描述并没有给出具体的解释。用户在docker-compose文件中指定了端口映射,无论是否使用该标志,端口都会映射到主机上。用户想知道这个标志的作用是什么。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据Docker的文档,docker-compose run命令用于对一个服务运行一次性命令。使用run命令时,会创建一个新的容器,并使用服务的配置进行配置,包括卷、链接和其他细节。然而,有两个重要的区别。
第一个区别是,run命令中传递的命令会覆盖服务配置中定义的命令。
第二个区别是,docker-compose run命令不会创建服务配置中指定的任何端口。这样可以防止与已经打开的端口发生冲突。如果确实希望创建并映射服务的端口到主机上,请使用--service-ports标志。例如:

docker-compose run --service-ports web python manage.py shell

另外,也可以使用--publish-p选项手动指定端口映射,就像使用docker run命令一样。例如:

docker-compose run --publish 8080:80 -p 2022:22 -p 127.0.0.1:2021:21 web python manage.py shell

这个标志的作用是允许你对已经定义的服务或服务使用docker-compose run运行单个命令。
例如,假设你设置了一个定义了某种服务的compose文件。要在后台运行该服务,可以使用docker-compose -f <FILE> up --detach命令,但是如果你想使用终端查看容器内部,可以运行docker-compose run bash命令。
端口被忽略的原因是,docker-compose run假设容器已经设置好,并且端口已经正确映射。如果你使用docker-compose run /path/to/script.sh运行一个涉及端口的脚本,你可能不希望它改变已经通过docker-compose up命令正确映射的端口。这样,该选项使得你必须明确告诉Docker“我实际上希望端口映射发生变化”。

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

示例:

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

正文完