Я пытаюсь Dockerize старую сборку sbt, которой требуется доступ к частному репозиторию нексуса. Раньше я использовал локальный файл учетных данных, на который ссылается build.sbt, но это не совсем подходит для моего использования в настоящее время, поскольку я хочу загрузить все из сборки Dockerfile. Я предпочитаю не выводить данные в файл, а затем копировать их в свой контейнер сборки докеров, а просто передавать их как ARG докеров.
Под https://www.scala-sbt.org/1.0/docs/Publishing.html
Я читал, что могу передать это так:
credentials += Credentials("Some Nexus Repository Manager",
"my.artifact.repo.net", "admin", "admin123")
Поэтому я решил, что могу сделать что-то вроде:
ARG REPO_USER
ARG REPO_PWD
RUN sbt ";credentials += Credentials(\"Some Nexus Repository Manager\", \"repo.host.com\", ${REPO_USER}, ${REPO_PWD}) ;package"
а затем запустить
docker build . --build-arg REPO_USER=foobar --build-arg REPO_PWD=*****
в моем Dockerfile, но это не сработало. Я все еще получаю:
Не удалось найти учетные данные для [Sonatype Nexus Repository Manager @ repo.host.com]
Есть ли способ отлично передать учетные данные репо в sbt из cli?
Я попробовал файловый подход, но это не решило проблему, поэтому я думаю, что могу ошибиться в том, что на самом деле здесь не так.
RUN echo "realm=Sonatype Nexus Repository Manager" >> .credentials && \
echo "host=repo.host.se" >> .credentials && \
echo "user=$REPO_USER" >> .credentials && \
echo "password=$REPO_PWD" >> .credentials && \
export SBT_CREDENTIALS=.credentials && \
sbt package
Я думаю, что это больше не вопрос Docker, поскольку я отладил его в контейнере докеров. Sbt просто не получил бы мои кредиты, как бы я ни передавал его в соответствии с документами sbt.
Я отвечу на свой вопрос.
@laughedelic Еще удачи. Я даже пытался использовать файл с кредитами, но он все равно не работал, так что, возможно, я ошибаюсь в том, что на самом деле не так ...
почему вы храните crendentails в образе докера
@IjazAhmadKhan Не хочу, но нужны кредиты для сборки, так как для сборки нужен доступ к частному репо. Делая это с многоэтапными сборками, я думаю, что смогу исправить эту проблему с безопасностью, как только я вообще заработаю. Предположение?
делать все за пределами докера, а затем копировать результаты в образ докера
@IjazAhmadKhan. Вот воспроизводимые сборки с докером в. Как gitlab.ci drone.io.
да, вы можете иметь воспроизводимые сборки, просто выполняйте сборки в простой работе, а затем запускайте сборку докеров и используйте артефакт из предыдущей работы
> просто делать сборки на простой работе, что такое обычная работа? Все задания определяются из образов докеров на указанных серверах сборки. Чтобы быть супер конкретным, моя сборка взята из hseeberger / scala-sbt: 11.0.1_2.12.7_1.2.6.





Документы sbt в лучшем случае вводят в заблуждение или просто ошибочны. После отладки этого к битам в контейнере докеров я обнаружил, что у меня нет возможности передать команду creds, чтобы они были подобраны. Переменная SBT_CREDENTIALS тоже не работает.
Наконец-то меня спас этот комментарий: SBT не может найти учетные данные при попытке загрузки из виртуального репозитория Artifactory
Наименее навязчивый способ работы, который у меня есть, - это добавить файл конфигурации sbt в домашний каталог образа докера:
RUN mkdir .sbt/0.13/plugins && \
echo "credentials += Credentials(\"Sonatype Nexus Repository Manager\", \"repo.host.se\", \"$REPO_USER\", \"$REPO_PWD\")" >> .sbt/0.13/plugins/creds.sbt
RUN sbt package
Вы можете использовать переменные среды. Вы можете установить их в dockerfile прямо или из аргументов. Что-то вроде этого:
ARG REPO_USR
ARG REPO_PWD
ENV REPO_USR = ${REPO_USR}
ENV REPO_PWD = ${REPO_PWD}
Затем вы можете использовать переменные среды в sbt:
val repoUser = sys.env.get("REPO_USR").getOrElse("")
val repoPass = sys.env.get("REPO_PWS").getOrElse("")
credentials += Credentials("Repo Realm", "repo.url.com", repoUser, repoPass)
Затем вы можете передать аргументы в сборку докеров, и они будут переданы в sbt.
Проблема во второй части, я думаю, вы имеете в виду правку build.sbt. Я хотел, чтобы нет отредактировал сборку sbt, но Только добавил Dockerfile в репо и передал кредиты через CLI. Наименее навязчивый способ, который я нашел, - это позволить Dockerfile добавить отдельный файл sbt под $ HOME / .sbt изображения, потому что, похоже, нет способа передать кредиты sbt, не просматривая файл.
Попробуйте
sbt ';set credentials ...'