docker-compose图像名称:“prefix_%s_1”而不是“%s”

r6hnlfcb  于 2023-05-06  发布在  Docker
关注(0)|答案(5)|浏览(205)

当我在带有链接的docker-compose.yaml文件中设置几个Docker容器时,容器的名称最终的格式是prefix_%s_1而不是%s,并且链接容器上/etc/hosts中的别名是相同的。

为什么redis容器的别名是test_redis_1而不是redis

以下是相关文件和输出:

# docker-compose.yaml
monkey:
    build: ../../monkey
    dockerfile: test.Dockerfile
    links:
      - redis:redis
    ports:
      - "9006:9006"

redis:
    build: ../storage/redis
    ports:
      - "6379:6379"

运行docker-compose build && docker-compose up后:

$ docker-compose ps
Name           Command                        State  Ports
---------------------------------------------------------------------------
test_redis_1   redis-server /usr/local/et ...   Up   0.0.0.0:6379->6379/tcp
test_monkey_1  python -m SimpleHTTPServer ...   Up   0.0.0.0:9006->9006/tcp

test_monkey_1容器的输出:

Step 14 : RUN cat /etc/hosts
 ---> Running in 1c104e3d9bf5
172.17.1.26     75a485df1325
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.1.26     thirsty_lumiere.bridge
172.17.0.220    test_redis_1
172.17.0.220    test_redis_1.bridge
172.17.1.26     thirsty_lumiere
 ---> 3a06bac9b3ca
Removing intermediate container 1c104e3d9bf5
Step 15 : RUN echo
 ---> Running in a1c5b5f8ae0f

 ---> 385c9ee44332
Removing intermediate container a1c5b5f8ae0f
Step 16 : RUN ifconfig eth0 | grep inet addr
 ---> Running in 17cd638c6473
          inet addr:172.17.1.28  Bcast:0.0.0.0  Mask:255.255.0.0
 ---> 21235e29abc1
Removing intermediate container 17cd638c6473
Step 17 : RUN echo
 ---> Running in 8c0b1db2a69b

 ---> e2dd190eb4d1
Removing intermediate container 8c0b1db2a69b
Step 18 : RUN env
 ---> Running in 50cd1b6bf9da
HOSTNAME=75a485df1325
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/data/web/tunnelbear.com/play/tPWD=/data/web/tunnelbear.com/root
_=/usr/bin/env
j1dl9f46

j1dl9f461#

根据docker compose issue #745
默认情况下,“合成”基于运行合成命令的目录的basename来确定项目名称。可以通过为每个命令传递-p / --project-name选项或设置COMPOSE_PROJECT_NAME环境变量来覆盖项目名称。
您可以通过编写以下代码为容器名称设置您选择的前缀:

$ docker-compose -p MY_PROJECT_NAME

它相当于(可读性更强):

$ docker-compose --project-name MY_PROJECT_NAME
cbjzeqam

cbjzeqam2#

您可以通过container_name将容器名称设置为您想要的:

redis:
    build: ../storage/redis
    container_name: redis
    ports:
      - "6379:6379"

容器主机名也可以通过hostname设置。

e7arh2l6

e7arh2l63#

Docker compose将使用包含compose文件的目录名作为项目名称,除非您通过-p option设置if

-p, --project-name NAME     Specify an alternate project name (default: directory name)

Compose支持声明放置在执行docker-compose命令的文件夹(当前工作目录)中的default environment variables in an environment file named .env
在这里您需要设置COMPOSE_PROJECT_NAME

jutyujz0

jutyujz04#

这就是docker-compose命名容器的方式,以便它可以管理它们。
basename是包含docker-compose.yaml文件的目录的名称。后面是在docker-compose.yaml文件中指定的容器名称,最后是一个示例编号,如果您使用docker-compose scale之类的东西调用容器的多个示例,则该编号会增加。
这种命名方案是docker-compose在您尝试使用docker-compose stop之类的东西对容器进行操作时能够识别容器的方式。
我不认为这与文档有任何冲突。也就是说,如果我从名为sotest的目录中的docker-compose.yaml开始:

irc:
  image: docker.io/xena/elemental-ircd
  links:
    - web

web:
  image: larsks/thttpd

然后,再打开作曲:

$ docker-compose up

有两个容器:

CONTAINER ID        IMAGE                           ...NAMES
960c1491c03e        docker.io/xena/elemental-ircd   ...sotest_irc_1
422bba313e71        larsks/thttpd                   ...sotest_web_1

如果我查看sotest_irc_1中的/etc/hosts文件,我会看到:

172.17.0.28 web 422bba313e71 sotest_web_1

除了一些其他的名字。因此,链接的主机可按文档中所述的名称使用。

lmvvr0a8

lmvvr0a85#

方法

dockerfile中的. define

在dockerfile的顶层

name: proj_name

//与其他方式似乎不完全相同

  • 这种方式不显示具有相同前缀但在其他目录中的服务

B. define in .env

.env在dockerfile的同一目录

COMPOSE_PROJECT_NAME=proj_name

//与-p方式相同的效果

  • 显示具有相同前缀的所有服务(即使在其他目录中)

C.在compose cli中指定

他们提到的方式。
-p,--项目名称字符串

docker compose --project-name proj_name

参考文献:
https://docs.docker.com/compose/environment-variables/envvars/#compose_project_name
https://github.com/docker/compose/issues/2982#issuecomment-285040554

相关问题