docker-compose图像命名为:"prefix_%s_1"而不是"%s"

Nei*_*eil 20 docker docker-compose

当我在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"
Run Code Online (Sandbox Code Playgroud)

运行后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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Arn*_*met 18

根据码头撰写问题#745:

默认情况下,Compose将项目名称作为目录的basename运行.可以通过为每个命令传递-p/--project-name选项或设置COMPOSE_PROJECT_NAME环境变量来覆盖项目名称.

您可以通过写下这样的内容将您选择的前缀设置为容器名称:

$ docker-compose -p MY_PROJECT_NAME
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了-p param而不工作`docker-compose -p''up -d`-我想将其设置为空 (2认同)
  • 但这将可以`docker-compose -p'somePrefix'up -d`,即不只是空值 (2认同)
  • @NamGVU 不可能像这样传递空项目名称。请参阅:https://github.com/docker/compose/issues/1621#issuecomment-118210322 (2认同)

Hon*_*Liu 9

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

redis:
    build: ../storage/redis
    container_name: redis
    ports:
      - "6379:6379"
Run Code Online (Sandbox Code Playgroud)

并且容器主机名也可以通过设置hostname.

  • 好主意,但这仅适用于单个实例,即无法缩放。如果你执行“docker-compose scale redis=3”,“container_name”将不起作用。`container_name` 被硬编码为单个实例。来源:https://github.com/docker/compose/issues/3722 (3认同)
  • 实际行为是 compose 将添加前缀和后缀 (2认同)

lar*_*sks 8

这就是 docker-compose 命名容器的方式,以便它可以管理它们。

basename 是包含docker-compose.yaml文件的目录的名称。这之后是docker-compose.yaml文件中指定的容器名称,最后是实例编号,如果您使用类似docker-compose scale.

这种命名方案是 docker-compose 在您尝试使用类似docker-compose stop.

我不认为这与文档有任何冲突。也就是说,如果我从docker-compose.yaml一个名为的目录中开始,例如sotest

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

web:
  image: larsks/thttpd
Run Code Online (Sandbox Code Playgroud)

然后调出撰写:

$ docker-compose up
Run Code Online (Sandbox Code Playgroud)

我得到两个容器:

CONTAINER ID        IMAGE                           ...NAMES
960c1491c03e        docker.io/xena/elemental-ircd   ...sotest_irc_1
422bba313e71        larsks/thttpd                   ...sotest_web_1
Run Code Online (Sandbox Code Playgroud)

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

172.17.0.28 web 422bba313e71 sotest_web_1
Run Code Online (Sandbox Code Playgroud)

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


den*_*nov 5

除非您通过-p选项进行设置,否则Docker compose将使用目录名称以及您的compose文件作为项目名称。

-p, --project-name NAME     Specify an alternate project name (default: directory name)
Run Code Online (Sandbox Code Playgroud)

Compose支持在名为.env的环境文件中声明默认环境变量,该文件位于执行docker -compose命令的文件夹(当前工作目录)中。

您要在哪里设置COMPOSE_PROJECT_NAME