docker-compose로 작성된 이미지 이름을 어떻게 정의합니까?


203

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모든 것을 실행할 때 괜찮지 만 새 이미지의 이름이 임의입니다. 빌드 이미지에 이름을 설정할 수 있습니까?


17
이미지를 구축하기 위해 고정 표시기-작성을 사용하는 경우, 이미지 이름은 항상 될 것입니다 <project>_<service>경우, <service>이 예제에 wildfly당신은에있어 디렉토리 이름에 프로젝트 기본값. 당신은 그와 변경할 수 있습니다 -p또는 COMPOSE_PROJECT_NAME환경 변수를. 사용자 정의 이미지 이름을 설정하는 방법은 없습니다.
dnephin

1
수용 가능한 답변이 없습니까?
AmanicA


2
당신은 또한 설정할 수 있습니다 COMPOSE_PROJECT_NAME=x에서 .env당신의 용기가 호출됩니다{x}_{service}_{#}
eMPee584

답변:


181

docker-compose 버전 2 파일 형식의 경우 한 서비스의 이미지를 작성하고 태그를 지정한 다음 다른 서비스에 동일한 빌드 이미지를 사용할 수 있습니다.

필자의 경우 두 개의 노드로 탄력적 검색 클러스터를 설정하려고합니다. 둘 다 동일한 이미지를 사용해야하지만 다르게 실행되도록 구성되었습니다. 또한 내 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"가 먼저 빌드되고 실행되는지 확인하십시오.


55
옵션이 container_name:정말 도움이되었습니다.
Bruno Bieri

2
이것이 효과가 있습니까? buildimage상호 배타적입니다. "서비스 xxx에 이미지와 빌드 경로가 모두 지정되어 있습니다. 이미지를 만들거나 기존 이미지를 사용하도록 서비스를 구축 할 수 있습니다."
Burhan Ali

3
아, 괜찮아 이 두 가지를 v2 형식과 함께 사용할 수 있습니다. 내가 테스트 한 것은 버전을 지정하지 않았으므로 v1이라고 가정합니다.
Burhan Ali

3
container_name 옵션 : 정말 도움이되었습니다
lanni654321

2
@BrunoBieri는 파일 depends_on에서 서비스 이름 doker-compose을 사용하므로 컨테이너 이름을 지정할 필요가 없습니다. 심지어 예를 들어 쇼를 depends_on: es-master하지depends_on: es_master
blueFast

65

당으로 고정 표시기-작성 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
오류 : 유효성 검사에 실패했습니다. 이유 : cornsoup에 이미지와 빌드 경로가 모두 지정되어 있습니다. 이미지를 만들거나 기존 이미지를 사용하도록 서비스를 구축 할 수 있습니다. (docker-compose 1.6.2)
zx1986

@ zx1986에 대한이 참조 고정 표시기 - compose.yml 파일의 새 버전을 사용한다는 것을 docs.docker.com/compose/compose-file/#upgrading 업데이트 된 내 대답을 기반으로
arulraj.net

50

옵션 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 's answer 참조 ).

옵션 3 : 컨테이너에서 이미지 생성

세 번째는 컨테이너에서 이미지를 만드는 것입니다.

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

1
--project-name더 이상 받아 들여지지 않는 것 같습니다. 1.23.2 사용
Steven Vachon

21

사용 사례에 따라 이미 생성 된 이미지를 사용하고에 이름을 지정할 수 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

10

이미지를 빌드 한 후 다음을 수행하십시오.

docker tag <image id> mynewtag:version

그 후 당신은 <none>당신이 갈 때 이미지가 더 이상 이름이 표시되지 않습니다 볼 수 있습니다 docker images.


3
docker-compose로 태그를 지정할 수 있습니까?
Robert

현재 태그가 지원되지 않는 것 같습니다.
GHETTO.CHiLD

1
이미지를 작성하고 나중에 다시 태그를 지정해야합니까? 실제로 유용하지는 않지만 docker-compose 가이 문제를 신속하게 해결하기를 바랍니다.
Robert

1
다중 컨테이너 환경을 구축하는 경우 예. 단일 컨테이너 환경을 구축하는 경우 항상 갈 수 있습니다docker build -t mytag:version .
GHETTO.CHiLD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.