我如何定义与docker-compose构建的图像的名称

我使用< >强docker-compose < / >强来创建我的开发环境。我想建立一个特定的图像,但我不知道如何为该图像设置一个名称。

wildfly:
build: /path/to/dir/Dockerfile
container_name: wildfly_server
ports:
- 9990:9990
- 80:8080
environment:
- MYSQL_HOST=mysql_server
- MONGO_HOST=mongo_server
- ELASTIC_HOST=elasticsearch_server
volumes:
- /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
links:
- mysql:mysql_server
- mongo:mongo_server
- elasticsearch:elasticsearch_server

当我执行docker-compose时,一切正常,但我为新图像获得了一个随机名称。是否可以为构建映像设置一个名称?

388473 次浏览

在你建立你的映像后,做以下工作:

docker tag <image id> mynewtag:version

之后,你会看到你的图像不再被命名为<none>,当你去docker images

根据你的用例,你可以使用一个已经创建的图像,并在docker-compose中指定它的名称。

我们有一个生产用例,其中CI服务器构建了一个命名的Docker映像。(docker build -t <specific_image_name> .)。一旦指定了命名的图像,我们的docker-compose总是基于特定的图像构建。这提供了几种不同的可能性:

1-你可以确保无论你从哪里运行你的docker-compose,你将总是使用该特定映像的最新版本。

2-你可以在你的docker-compose文件中指定多个命名图像,并让它们通过前面的构建步骤自动连接。

因此,如果你的图像已经构建,你可以用docker-compose来命名图像。删除build并指定image:

wildfly:
image: my_custom_wildfly_image
container_name: wildfly_server
ports:
- 9990:9990
- 80:8080
environment:
- MYSQL_HOST=mysql_server
- MONGO_HOST=mongo_server
- ELASTIC_HOST=elasticsearch_server
volumes:
- /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
links:
- mysql:mysql_server
- mongo:mongo_server
- elasticsearch:elasticsearch_server

根据docker-compose 1.6.0:

如果使用新的文件格式,现在可以同时指定构建和图像键。docker-compose build将构建图像并使用您指定的名称标记它,而docker-compose pull将尝试拉取它。

所以你的docker-compose.yml将是

version: '2'
services:
wildfly:
build: /path/to/dir/Dockerfile
image: wildfly_server
ports:
- 9990:9990
- 80:8080

更新docker-compose

sudo pip install -U docker-compose==1.6.0

选项1:提示默认图像名称

docker-compose生成的图像的名称默认情况下取决于文件夹名称,但你可以使用--project-name参数来覆盖它:

$ docker-compose --project-name foo build bar
$ docker images foo_bar

选项2:指定映像名称

一旦docker-compose 1.6.0出来,你可以指定build:image:有一个显式的图像名称(参见arulraj.net的回答)。

选项3:从容器中创建映像

第三种方法是从容器中创建一个映像:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar

对于docker-compose版本2文件格式,您可以为一个服务构建并标记一个映像,然后为另一个服务使用相同的构建映像。

对于我的例子,我想设置一个具有2个节点的elasticsearch集群,它们都需要使用相同的映像,但配置为不同的运行方式。我还想从自己的Dockerfile中构建自己的自定义elasticsearch映像。所以这就是我所做的(docker-compose.yml):

version: '2'


services:
es-master:
build: ./elasticsearch
image: porter/elasticsearch
ports:
- "9200:9200"
container_name: es_master


es-node:
image: porter/elasticsearch
depends_on:
- es-master
ports:
- "9200"
command: elasticsearch --discovery.zen.ping.unicast.hosts=es_master
你可以看到在第一个服务定义es-master中,我使用build选项从./elasticsearch中的Dockerfile构建一个映像。我用image选项标记图像的名称porter/elasticsearch
然后,我使用image选项在es-node服务定义中引用这个构建的映像,并且还使用depends_on来确保另一个容器es-master被构建并首先运行

根据Docker的3.9版本,你可以使用image: myapp:tag来指定名称和标签。

version: "3.9"
services:
webapp:
build:
context: .
dockerfile: Dockerfile
image: webapp:tag

参考:https://docs.docker.com/compose/compose-file/compose-file-v3/

Sudo docker-compose -p <构建

指定项目名称

注意:命令中'-p'选项出现在'build'之前

裁判:https://docs.docker.com/compose/reference/

如果你指定了image和build,那么Compose用image中指定的webapp和可选标签来命名构建的图像:

image: webapp:tag

在docker-compose文件中,它看起来像。

version: '3.9'
services:
  

node-ecom:
build: .
image: "webapp:tag"
container_name: node-ecom
ports:
- "4000:3000"
volumes:
- ./:/app:ro
- /app/node_modules
- /config/.env
env_file:
- ./config/.env

您可以自定义映像名称以构建&容器名在码头组装过程中,你需要像下面那样在docker-compose.yml文件中提到。它将创建一个图像&具有自定义名称的容器。

version: '3'
services:
frontend_dev:
stdin_open: true
environment:
- CHOKIDAR_USEPOLLING=true
build:
context: .
dockerfile: Dockerfile.dev
image: "mycustomname/sample:v1"
container_name: mycustomname_sample_v1
ports:
- '3000:3000'
volumes:
- /app/node_modules
- .:/app

我是这样做的:

version: '3.8'
services:
app:
build: .
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- ./:/usr/src/app/
container_name: docker-compose-employees
image: [Docker-Hub-Username]/docker-compose:latest

docker-compose应用程序运行时使用一个容器名:docker-compose-employees

和一个名为[Docker-Hub-Username]/docker-compose:latest的图像

如果使用Jenkins,则可以使用stackName = prefix定义项目名。

詹金斯:

stackName = 'foo'

码头工人:

services:
bar:

所以这个名字就变成了foo_bar

在你的服务中添加image: "YOUR-DESIRED-NAME"行。

< p >后台: 图片:backend_img < / p >