Я написал docker-compose.yml
файл со ссылкой на этот учебник: Запуск PostGraphile в Docker, но когда я запускаю эту команду docker-compose pull && docker-compose up -d
для обновления изображения, возникает ошибка:
WARNING: Some service image(s) must be built from source by running:
docker compose build graphql
Error response from daemon: pull access denied for forum-example-graphql, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Но если я бегу docker-compose up -d
, то все ок.
Интересно, как можно найти изображение forum-example-graphql
в следующем фрагменте (из докер-хаба?)?
graphql:
container_name: forum-example-graphql
restart: always
image: forum-example-graphql
build:
context: ./graphql
env_file:
- ./.env
depends_on:
- db
networks:
- network
ports:
- 5433:5433
command: ["--connection", "${DATABASE_URL}", "--port", "5433", "--schema", "public", "--append-plugins", "postgraphile-plugin-connection-filter"]
Я узнал из здесь, что имя изображения в файле компоновки основано на имени созданного изображения, но я не назвал локальное изображение как forum-example-graphql
.
В другом сервисе конфигурация следующая:
postgres:
container_name: postgres
image: postgres:latest
restart: always
volumes:
- "./postgres-data:/var/lib/postgresql/data"
networks:
- network
ports:
- "5432:5432"
Значение изображения установлено как postgres:latest
, и изображение извлекается непосредственно из концентратора докеров с использованием этой конфигурации, без контекста и файла Docker.
Затем мне интересно, как называется локальный образ и как он соотносится со значением образа службы.
@DavidMaze Итак, если я установлю image:
, вытащенное изображение node:alpine
из докер-хаба будет иметь локальное имя forum-example-graphql
?
Вам нужно docker-compose build
это изображение (это может быть FROM node:alpine
или что-то еще). Если вы не установите image:
, Compose выберет для него имя. Если вы установите его, то, как правило, вы захотите установить для него фактический Docker Hub или другое имя реестра image: registry-example-com/forum/graphql
, где вы можете push
или pull
его.
docker-compose pull, извлекает образ forum-example-graphql
из реестра образов, по умолчанию (концентратор докеров).
но поскольку он указан для сборки из каталога
build:
context: ./graphql
Следовательно, это изображение не нужно извлекать, вы можете использовать эту опцию --ignore-buildable
с docker-compose pull
, чтобы пропустить изображения с локальным контекстом сборки.
Также docker-compose up -d
по умолчанию извлекает изображение, если оно недоступно, и умно игнорирует локальные контексты и извлекает изображения, которые необходимо извлечь.
Спасибо за Ваш ответ. Если я не ошибаюсь, вы имеете в виду, что 1) docker-compose проверяет Dockerfile в build: context
, и если образ установлен, образ будет извлечен из реестра образов, а локальному образу будет присвоено имя, соответствующее тому, что мы установили в docker-compose.yml > services > graphql > image
, в противном случае 2) конфигурация image:
будет использоваться для извлечения образа из реестра, а имя локального образа будет именем по умолчанию. Я прав?
да, docker-compose проверяет образ в реестре. и docker-compose up -d делает и то, и другое. 1) проверка файла в реестре, 2) сборка образа на локальном компьютере, если предоставлен контекст build:
Невозможно выполнить команду docker-compose pull
на forum-example-graphql
-docker, потому что ее нет в общедоступном репозитории Docker Hub. Частью урока является то, что вы сами создаете это изображение, используя docker-compose build
(см. здесь).
После выполнения команды build
вы можете использовать up -d
, чтобы запустить образ, который вы создаете (с именем forum-example-graphql
).
(Рассмотрите возможность удаления строки
image:
, чтобы избежать этого предупреждения, и позвольте Compose самому выбрать имя изображения. Вам также не нужноcontainer_name:
, и, вероятно, вы можете удалить каждый блокnetworks:
во всем файле.)