Как определить имя образа, созданного с помощью 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
все в порядке, но я получаю случайное имя для нового изображения. Можно ли задать имя для образа сборки?
12 ответов
Для формата файла docker-compose версии 2 вы можете создать и пометить образ для одного сервиса, а затем использовать этот же встроенный образ для другого сервиса.
В моем случае я хочу настроить упругий поисковый кластер с 2 узлами, оба они должны использовать одно и то же изображение, но настроенные для работы по-разному. Я также хочу создать свой собственный эластичный образ поиска из моего собственного Dockerfile. Вот что я сделал (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" для сборки образа из файла Dockerfile в./elasticsearch. Я помечаю изображение с именем "porter /asticsearch" с опцией "изображение". Затем я ссылаюсь на этот встроенный образ в определении сервиса "es-node" с параметром "image", а также использую "зависящий_он", чтобы убедиться, что другой контейнер "es-master" собран и запущен первым.
Согласно 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
Согласно версии 3.9 Docker compose вы можете использовать
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/
В зависимости от вашего варианта использования, вы можете использовать изображение, которое уже было создано, и указать его имя в 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 tag <image id> mynewtag:version
после этого вы увидите, что ваше изображение больше не называется <none>
когда ты пойдешь docker images
,
вы можете настроить имя образа для сборки и имя контейнера во время компоновки docker для этого, вам нужно указать, как показано ниже, в файле 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
в docker-compose.yml добавьтеimage: "YOUR-DESIRED-NAME"
строка в вашей службе, например, если ваше имя службыwildfly
и вы хотите назвать свое изображение какwildfly_img
wildfly: image: wildfly_img
sudo docker-compose -p <имя_проекта> build
назначает название проекта
Примечание: параметр '-p' ставится перед 'build' в команде
Я сделал это:
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
Если вы укажете образ, а также сборку, то Compose назовет построенный образ веб-приложением и необязательным тегом, указанным в изображении:
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
Если используется Jenkins, имя проекта можно определить с помощью
stackName = prefix
.
Дженкинс:
stackName = 'foo'
докер:
services:
bar:
Так имя становится
foo_bar
.