exec-maven-плагин — копирование каталога из контейнера docker на хост

#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