我使用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时,一切正常,但我为新映像获得了一个随机名称。是否可以为构建映像设置一个名称?
根据您的用例,您可以使用已经创建的映像,并在docker-compose中指定它的名称。
我们有一个生产用例,其中CI服务器构建了一个命名的Docker映像。(docker build -t <specific_image_name> .)。一旦指定了命名的映像,我们的docker-compose总是基于特定的映像构建。这提供了几种不同的可能性:
1-你可以确保无论你从哪里运行docker-compose,你将总是使用该特定映像的最新版本。
2-你可以在docker-compose文件中指定多个命名图像,并让它们通过前面的构建步骤自动连接。
所以,如果你的映像已经构建好了,你可以用docker-compose来命名映像。删除构建并指定映像:
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
选项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中,我使用构建选项从./elasticsearch中的Dockerfile构建一个映像。我用名称porter/elasticsearch和image选项标记图像。
然后,我使用image选项在es-node服务定义中引用这个构建的映像,并使用depends_on来确保先构建并运行另一个容器es-master。