#docker #maven
Вопрос:
Я пытаюсь использовать плагин maven exec для копирования каталога из запущенного контейнера docker на хост во время сборки maven. Каталог успешно копируется при выполнении цели exec из командной строки
mvn exec:exec -Dexec.executable="docker" -Dexec.args="cp $(docker ps -aqf "name=my_container"):/home/user/out ./target/user-reports"
Однако не удается с ошибкой
Ошибка: Такого контейнера нет:путь: $(докер ps-aqf «имя=my_container»):/главная/пользователь/выход [ОШИБКА] Не удалось выполнить команду. org.apache.commons.exec.Исключение ExecuteException: Процесс завершен с ошибкой: 1 (значение выхода: 1)
на maven установите плагин, настроенный следующим образом
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>Copy user reports from container to host</id>
<goals>
<goal>exec</goal>
</goals>
<phase>post-integration-test</phase>
<configuration>
<executable>docker</executable>
<arguments>
<argument>cp</argument>
<argument>$(docker ps -aqf "name=my_container"):/home/user/out ./target/user-reports</argument>
</arguments>
</configuration>
</execution>
</plugin>
Я попытался отделить каталог хоста «./target/user-reports» в отдельном теге аргумента, что привело к той же ошибке.
Использование монтирования тома не является опцией, так как сборка выполняется внутри другого контейнера docker (Dind) в моей среде CI. Любой вклад в то, чего мне не хватает, очень ценится, спасибо.
Ответ №1:
Maven здесь не запускает оболочку, поэтому конструкции оболочки, такие как $(...)
подстановка команд, не будут работать. Вам также нужно обязательно разделить каждое «слово» на отдельное <argument/>
.
Большинство команд Docker, которые принимают идентификаторы контейнеров, также принимают имена контейнеров. Таким образом, вам не нужно использовать docker ps -qf name=...
идентификатор контейнера для поиска; вы можете просто использовать его имя непосредственно в команде.
Сочетание этого должно дать вам:
<configuration>
<executable>docker</executable>
<arguments>
<argument>cp</argument>
<argument>my_container:/home/user/out</argument>
<argument>./target/user-reports</argument>
</arguments>
</configuration>
Комментарии:
1. Большое вам спасибо за прояснение ситуации. 1