Сохранённый вход в 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 показываетenvironmentstored

Каждый запуск, у которого есть ключ, может его прочитать, а с сохранённым входом это каждый запуск.

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, как в разделе как узнать, есть ли сохранённый вход.

Проверено на одноразовом томе с фиктивным ключом.

Удаление сохранённого входа

Укажите провайдера и метку. Метка — второй столбец 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, тоже убирает вход — вместе со всеми сессиями.

Автор статьи: Клавдия Кондакова