sbt родной упаковщик dockerCommands copy - PullRequest
0 голосов
/ 09 мая 2018

Поиск в Интернете и здесь, но не смог найти ответ, который решает мою проблему.

Моя проблема в том, что я хочу создать образ докера с некоторыми пользовательскими сценариями sql, скопированными из локальной файловой системы в образ докера.

Структура каталогов (несколько модулей проектов) составляет

my_sbt
    + my_app
        - build.sbt ...
    + database
        - build.sbt 
        + scripts
            - ... several sql scripts ...

database / build.sbt содержит dockerCommands

dockerCommands := Seq(
  Cmd("FROM", "postgres:9.5"),
  Cmd("EXPOSE", "5432"),
  Cmd("COPY", (baseDirectory.value / "database" / "scripts" / "a.sql").toPath.toAbsolutePath.toString, "/docker-entrypoint-initdb.d/a.sql")
)

Изображение может быть успешно создано, если без COPY Cmd (т. Е. docker run -d --rm -p 5432:5432 <docker image> запускает контейнер, и docker exec -it <container id> bash может выполнить bash для контейнера, и проверка выполнения выполняется на ps -ef в bash контейнера). Однако добавление оператора COPY в dockerCommands приводит к сбою процесса сборки sbt docker:publishLocal с ошибкой java.lang.RuntimeException: ненулевое значение выхода: 1

java.lang.RuntimeException: Nonzero exit value: 1
    at com.typesafe.sbt.packager.docker.DockerPlugin$.publishLocalDocker(DockerPlugin.scala:335)
    at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$22.apply(DockerPlugin.scala:119)
    at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$22.apply(DockerPlugin.scala:117)
...

Запуск sbt с помощью -d sbt -d docker:publishLocal не помогает, так как он все еще выдает Ненулевое значение выхода: 1 , что не помогает вообще.

Как правильно обращаться к локальным сценариям и копировать их в образ докера?

Спасибо

РЕДАКТИРОВАТЬ:

  • Просто обратите внимание, что нативный упаковщик sbt, похоже, лишает путь к ведущему корневому каталогу, то есть '/'. Есть причина, почему это так? И как предотвратить ведение / срывание?

    [info] Step 3/3 : COPY /path/to/database/scripts/users.sql /docker-entrypoint-initdb.d/users.sql
    [error] lstat path/to/database/scripts/users.sql: no such file or directory
    

1 Ответ

0 голосов
/ 09 мая 2018

Ссылка на https://serverfault.com/questions/666149/docker-copy-issue-no-such-file-or-directory/666154#666154 решает мою проблему.

В основном, проблема заключается в косвенном способе ассоциирования локальных файлов с докером.

  1. Собственный упаковщик sbt копирует локальные файлы в target / docker / stage на основе сопоставлений в разделе Universal . Например, приведенный ниже фрагмент кода копирует a.sql в target / docker / stage / opt / docker / scripts в каталоге проекта

    mappings in Universal := {
      (mappings in Universal).value :+
      (file(s"${baseDirectory.value}/scripts/a.sql") -> "scripts/a.sql") 
    }
    
  2. Собственный упаковщик sbt затем копирует файлы, расположенные в target / docker / stage /, в контейнер докера на основе dockerCommands Cmd("COPY", "/opt/docker/scripts/a.sql", "/docker-entrypoint-initdb.d")

То есть The <src> path must be inside the context of the build; ..., где контекст фактически начинается с target / docker / stage / .

...