Что происходит, когда плагин docker-maven пытается создать образ?

Я запускаю Дженкинса в контейнере докеров, и Дженкинс пытается запустить мою сборку maven. Как часть сборки, плагин docker maven инструктирует его создать изображение докеров.

Эта часть ПОМ ниже.

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.3.8</version>
    <configuration>
        <imageName>example</imageName>
        <baseImage>java:latest</baseImage>
        <skipDockerBuild>false</skipDockerBuild>
        <cmd>["java", "-jar", "myLogThread-jar-with-dependencies.jar"]</cmd>
        <resources>
            <resource>
                <directory>target/</directory>
                <include>config.properties</include>
            </resource>
            <resource>
                <directory>${project.build.directory}</directory>
                <include>myLogThread-jar-with-dependencies.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

Команда maven работает до тех пор, пока не попытается создать изображение, после чего выдается следующее сообщение об ошибке:

[INFO] Building image example
[INFO] I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: Permission denied

Я могу войти в правильный каталог, и там находится файл Docker.

Я также могу запустить sudo docker build. и он будет создавать изображение без проблем.

Почему сборка maven не работает? Какой запрос делается на localhost: 80? Как я могу исправить это, чтобы maven мог создать мой образ?

Примечание. Я установил гнездо для докеров и двоичный код в этом контейнере

Ответы

Ответ 1

Это можно решить, добавив переменную окружения DOCKER_HOST в Jenkins.

Установите демона докеров таким образом:

[/etc/sysconfig/docker]
OPTIONS="-H tcp://127.0.0.1:4243"

Jenkins Jobs (переменные среды Inject):

DOCKER_HOST=tcp://127.0.0.1:4243

Ответ 2

Как упоминалось выше Раджитом Делантой, это решило проблему для меня:

Добавить: DOCKER_OPTS=' -G jenkins' непосредственно в /etc/default/docker.

Затем перезапустите sudo service docker restart.

Ответ 3

У меня была та же проблема, но на моей локальной машине.

У меня есть это после прочтения этого комментария в потоке Github: https://github.com/docker/compose/issues/1214#issuecomment-256774629

В нем говорится:

Решение (с https://docs.docker.com/engine/installation/linux/debian/, работает не только с Debian):

Добавьте группу докеров, если она еще не существует.

sudo groupadd docker

Добавьте подключенного пользователя "$ {USER}" в группу докеров. Измените имя пользователя в соответствии с вашим предпочтительным пользователем. Возможно, вам придется выйти из системы и снова войти в систему, чтобы это вступило в силу.

sudo gpasswd -a ${USER} docker

Перезапустите демон Docker.

sudo service docker restart

Ответ 4

Я смог решить проблему, объединив элементы как отложенных ответов.

Установите параметры для использования другого порта в /etc/default/docker.

DOCKER_OPTS="-H tcp://127.0.0.1:4243"

Перезапустите демон Docker.

sudo service docker restart

Затем создайте свой пакет.

export DOCKER_HOST=tcp://127.0.0.1:4243
mvn clean package docker:build

Ответ 5

Я встретил проблему у бамбукового агента, но я полагаю, что это относится и к дженкинсам.

Добавьте пользователя, запускающего maven в группу докеров. Затем перезапустите докер и службу, запущенную maven. Групповые изменения не загружаются во время работы служб. Так что в моем случае:

sudo groupadd docker # if it does not exist
sudo usermod -a -G docker bamboo-user
sudo systemctl restart docker.service
sudo systemctl restart bamboo-agent.service

Ответ 6

после того, как убедитесь, что docker ps работает от того же пользователя, который запускает mvn меня все еще была та же проблема. это похоже на ошибку из-за специальных символов в имени изображения. Я разрешил его, удалив знак тире (-) (или любые специальные символы) из имени изображения докеры.

попробуйте установить репозиторий для определения имени и проверки.

            <configuration>
                <repository>somename</repository>                    
            </configuration>