Сохранённый вход в OpenCode в Docker: проверить, использовать, создать или удалить
Введение
Эта статья — часть большого руководства
OpenCode в Docker на Ubuntu 24.04.
Руководство показывает, как запускать
OpenCode с флагом
--auto внутри контейнера
Docker.
С --auto агент не спрашивает вас перед каждой
командой, поэтому контейнер ограничивает то, до чего он может достать:
агент работает только в одном git worktree, отдельной
копии проекта.
В этой настройке платная модель получает ключ одним из двух способов: из
файла ключа, который лаунчер передаёт на один запуск, или из сохранённого
входа.
Эта статья объясняет, что такое сохранённый вход, как узнать, есть ли он
у вас, как им пользоваться и что делать, если его нет.
Что такое сохранённый вход
Сохранённый вход — это ключ, который вы отдали OpenCode внутри контейнера
командой opencode auth login.
OpenCode сохраняет его в своей базе, opencode.db,
в томе сессий opencode-agent-data.
Лаунчер монтирует этот том в каждый контейнер, с любым образом.
Поэтому каждый следующий запуск видит этот вход, и лаунчеру вы ничего не
передаёте.
| Файл ключа | Сохранённый вход | |
|---|---|---|
| Как его заводят | файл в ~/.config/opencode-agent на хосте | opencode auth login в контейнере |
| Где лежит ключ | в этом файле | в opencode.db в томе сессий |
| Какие запуски его получают | только запуски с --opencode-key или --openrouter-key | каждый запуск, включая запуски на бесплатной модели |
| opencode auth list показывает | environment | stored |
Каждый запуск, у которого есть ключ, может его прочитать, а с сохранённым
входом это каждый запуск.
opencode auth export печатает сохранённые ключи
открытым текстом.
Проверено на одноразовом томе с фиктивным ключом:
opencode auth export
[ { "id": "cred_1a62bc2e7001UPeX228degeY89", "integrationID": "opencode-go", "label": "OpenCode Go", "active": true, "value": { "type": "key", "key": "dummy-test-key-123" } } ]
Агент с --auto может выполнить ту же команду.
Файл ключа — более безопасный выбор: запуски без этой опции никогда не
получают ключ (ключи для
одного запуска).
Как узнать, есть ли сохранённый вход
Спросите OpenCode в одноразовом контейнере на томе сессий.
Worktree для этого не нужен, а контейнер завершается вместе с командой:
docker run --rm -v opencode-agent-data:/home/agent/.local/share/opencode opencode-agent auth list
При сохранённом входе для OpenCode Go строка заканчивается на stored:
OpenCode Go OpenCode Go stored
Без сохранённого входа:
No authenticated integrations
В оболочке шага 6 (проверка, что
видит контейнер) команда та же — opencode auth
list.
Там она ещё перечисляет ключи, которые лаунчер передал запуску, с
environment в конце.
Сохранённый вход и ключ, переданный через
--opencode-key, одновременно:
OpenCode Go OpenCode Go stored OpenCode Go OPENCODE_API_KEY environment OpenCode Console OPENCODE_API_KEY environment
Оставьте для провайдера что-то одно, чтобы знать, какой ключ использует запуск.
stored не значит, что ключ работает.
OpenCode не проверяет ключ, когда сохраняет его.
Неверный ключ падает на первом запросе запуска. Проверено с фиктивным
ключом:
Error: Upstream request failed: Invalid credential
Как пользоваться сохранённым входом
Запускайте задачу как обычно и выберите модель этого провайдера через -m. Опцию с ключом вы не добавляете:
container/tools/ai/opencode-docker.sh ../site-agent-<task> run --title <task> -m opencode-go/deepseek-v4.1-flash "<what to do>"
Так шла долгая задача этой настройки — в образе с
Erlang и с задачей в файле.
Она работала на DeepSeek V4.1 Flash
через OpenCode Go:
container/tools/ai/opencode-docker.sh --erlang ../site-agent-<task> run --title <task> -m opencode-go/deepseek-v4.1-flash "$(cat ~/tasks/<task>.md)"
Чтобы продолжить задачу, которая остановилась на лимите бесплатной
модели, добавьте -s <id>
(когда бесплатная модель
упирается в лимит).
Какие модели даёт провайдер: в оболочке шага 6 их перечисляет
opencode models, например модели OpenCode Go:
opencode models | grep '^opencode-go/deepseek'
opencode-go/deepseek-v4-pro opencode-go/deepseek-v4.1-flash
Что делать, если сохранённого входа нет
У вас два варианта.
1. Передавать файл ключа в каждый запуск. Это более безопасный
путь: ключ получают только те запуски, которые вы начали с этой опцией.
Как сохранить ключ и передать его, рассказано в разделе
Ключи для одного запуска
статьи про лаунчер — для OpenCode Go, и в разделе
1. Ключ для
контейнера статьи про OpenRouter — для
OpenRouter.
container/tools/ai/opencode-docker.sh --opencode-key ~/.config/opencode-agent/opencode.key ../site-agent-<task> run -m opencode-go/deepseek-v4.1-flash "<what to do>"
2. Сохранить вход. Скопируйте ключ вашей подписки OpenCode Go из
консоли
OpenCode.
Затем запустите форму входа в одноразовом контейнере на томе сессий.
-it даёт форме терминал, без которого она не
работает:
docker run --rm -it -v opencode-agent-data:/home/agent/.local/share/opencode opencode-agent auth login opencode-go --method key
Вставьте ключ в приглашении. Он показывается точками. Нажмите Enter. Конец вывода:
◇ Connected to OpenCode Go │ └ Done
Проверьте через auth list, как в разделе
как узнать, есть ли сохранённый вход.
Проверено на одноразовом томе с фиктивным ключом.
- Без -it форма останавливается: API key input requires an interactive terminal.
- Для OpenRouter напишите openrouter вместо opencode-go. Способ входа там тоже key; сам вход проверяли только с OpenCode Go.
- Берите ключ, сделанный для контейнера, с лимитом расходов, а не тот, которым пользуетесь на хосте. Прочитать его может каждый запуск.
Удаление сохранённого входа
Укажите провайдера и метку. Метка — второй столбец auth list:
docker run --rm -v opencode-agent-data:/home/agent/.local/share/opencode opencode-agent auth logout opencode-go "OpenCode Go"
◇ Removed account from OpenCode Go └ Done
Без метки команда открывает выбор, которому нужен
-it.
Без терминала она останавливается с Pass a credential ID
or label when running without an interactive terminal. Проверено на
одноразовом томе.
Удаление всего тома, docker volume rm
opencode-agent-data, тоже убирает вход — вместе со всеми сессиями.
Автор статьи: Клавдия Кондакова