我有一个docker-compose.yml文件,如下所示(一部分):
version: '3.5'
services:
framework:
image: ${DOCKER_REGISTRY}/gme/fmk:${COMPOSE_PROJECT_NAME}
build: ./fmk
ports:
- "2020:2020"
- "2025:2025"
- "4999:4999"
volumes:
- ${FOLDER_ENV}/workspace/logs/framework:/var/log/gcti
- ${FOLDER_ENV}/..:/usr/local/genesys/gsg_qaart
我得到的是:
vagrant@docker:/repos/gsg_qaart/docker$ docker-compose ps
] Name Command State
Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
callback_framework_1_df361f67842c /bootstrap.sh Up 0.0.0.0:2020->2020/tcp, 0.0.0.0:2025->2025/tcp, 0.0.0.0:4999->4999/tcp, 5432/tcp
您可以看到名称很奇怪,它应该是“ callback_framwork_1”,为什么末尾会有一个随机数?
顺便说一句,我正在使用:
vagrant@docker:/repos/gsg_qaart/docker$ docker -v
Docker version 18.09.0, build 4d60db4
vagrant@docker:/repos/gsg_qaart/docker$ docker-compose -v
docker-compose version 1.23.1, build b02f1306
谢谢。
答案 0 :(得分:5)
编辑。
此更改已在v1.23.2中恢复
因此,撰写v1.23 https://github.com/docker/compose/releases/tag/1.23.0
发生了重要变化Compose在此创建的容器的默认命名方案 版本已从project_service_index更改为 project_service_index_slug,其中slug是 随机生成的十六进制字符串。请确保更新 脚本在升级之前会相应地依赖旧的命名方案。
因此,如果要使用确定性的容器名称,请使用
services:
framework:
container_name: framework
答案 1 :(得分:0)
我无法对容器名称进行硬编码,并且希望能够从任何目录运行。所以我最终删除了部分名称:
docker exec -it $(docker ps --format='{{.Names}}' | grep server) bash
答案 2 :(得分:0)
请注意,其他答案/问题排查是有效/正确的,但是尽管docker-compose如何还原了该问题,但我还是想为使用docker-compose提供一些思路。在使用docker-compose服务时,有一个很好的实践值得强调。
我个人的想法是docker-compose,试图改变其工具的使用方式。我在github上阅读了一些暗示这一点的内容,但这是在阅读了他们的一些开发人员反馈后,特别是以下github issue on the slugs的反馈。
我试图概括一下,因为以下示例可能并不完全适用于您的设置,但是它们仍然应该有所帮助。由于您已经在使用docker-compose,因此使用通过docker网络和docker-compose提供的服务发现优于通过容器名称进行硬编码访问。
使用docker-compose时,将创建由1 .. *容器组成的服务。在您的示例中,服务framework
是使用1个容器callback_framework_1_df361f67842c
创建的。
服务可以用于DNS /网络而不是容器名称,即在<protocol>://<host>:<port>/<endpoint>
被用作container name
的{{1}}处,<host>
也可以用于容器用作service name
(例如在docker网络上的另一个容器内执行ping操作):
<host>
vs
ping <service>
ping framework
以上ping均有效。 Docker负责与适当容器的联网,此外,当有多个容器组成服务时,Docker还负责对容器的负载平衡请求。
如果您有从主机执行的脚本,也可以使用docker-compose代替docker命令:
ping <container-name>
ping callback_framework_1_df361f67842c
vs
docker-compose exec <service> sh
docker-compose exec framework sh
docker-exec默认为第一个容器,但是当有多个容器组成docker服务时,可以使用docker exec -it <container-name> sh
docker exec -it callback_framework_1_df361f67842c sh
标志寻址目标容器。有关更多详细信息,请参见docker-compose exec documentation。