Docker Compose не позволяет использовать локальные изображения

Следующая команда не работает, пытаясь вытащить изображение из Docker Hub:

$ docker-compose up -d
Pulling web-server (web-server:staging)...
ERROR: repository web-server not found: does not exist or no pull access

Но я просто хочу использовать локальную версию изображения, которая существует:

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
web-server           staging             b94573990687        7 hours ago         365MB

Почему Docker не выполняет поиск среди локально сохраненных изображений?


Это мой файл Docker Compose:

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: web-server:staging
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

и мой .env файл:

DOCKER_HOST=tcp://***.***.**.**:2376
DOCKER_TLS_VERIFY=true 
DOCKER_CERT_PATH=/Users/Victor/Documents/Development/projects/.../target/docker

Ответ 1

В общем, это должно работать, когда вы его описываете. Пытался воспроизвести его, но он просто работал...

Структура папки:

.
├── docker-compose.yml
└── Dockerfile

Содержимое файла Docker:

FROM alpine
CMD ["echo", "i am groot"]

Изображение сборки и тегов:

docker build -t groot .
docker tag groot:latest groot:staging

с docker-compose.yml:

version: '3.1'
services:
  groot:
    image: groot:staging

и запустите docker-compose:

$ docker-compose up
Creating groot_groot ... 
Creating groot_groot_1 ... done
Attaching to groot_groot_1
groot_1  | i am groot
groot_groot_1 exited with code 0

Ответ 2

В вашем docker-compose.yml вы можете указать build: . вместо build: <username>/repo> для локальных сборок (вместо извлечения из docker-hub) - я пока не могу проверить это, но я полагаю, что вы можете сделать относительный пути для нескольких сервисов к файлу docker-compose.

services:
  app:
    build: .

Ссылка: https://github.com/gvilarino/docker-workshop

Ответ 3

Возможно, вам понадобится изменить свой тег изображения, чтобы две части были разделены косой чертой /. Поэтому вместо

chat-server:staging

сделайте что-нибудь вроде:

victor-dombrovsky/chat-server:staging

Я думаю, что существует некоторая логика тегов Docker, а теги "одной части" интерпретируются как официальные изображения, поступающие из DockerHub.

Ответ 4

Добавление ответа @Tom Saleeba,

Я все еще получил ошибки после пометки контейнера с "/" (например: victor-dombrovsky/docker-image:latest) Он продолжал искать изображение с удаленного сервера docker.io.

registry_address/docker-image

Кажется, что URL перед "/" является адресом реестра, а после "/" - именем изображения. и без "/", docker-compose по умолчанию ищет изображение из удаленного docker.io.

Кажется, это известная ошибка с docker-compose

Наконец-то я заработал, запустив локальный реестр, переместившись в локальный реестр с тегом реестра и вытянув изображение из локального реестра.

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
$ docker tag your-image-name:latest localhost:5000/your-image-name
$ docker push localhost:5000/your-image-name

а затем измените URL изображения в файле Docker:

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: localhost:5000/your-image-name #####change here
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

Аналогично для чата-сервера.