Как запустить docker контейнер с Gradle? - PullRequest
2 голосов
/ 27 января 2020

Я пытаюсь переключиться с Cmake на gradle. Я хочу настроить gradle для работы следующим образом:

$ cd myapp && ls myapp
$ Dockerfile build.gradle src 
$ gradle build
  1. Создание образа docker из docker файла
  2. запуска контейнера
  3. сборка приложения

Образ docker содержит полную среду для моего приложения.

FROM debian:stretch


RUN  apt-get update -y && apt install -y   git \
      python3-dev libncurses5-dev libxml2-dev \
      libedit-dev swig doxygen graphviz xz-utils ninja-build


RUN echo "deb http://ftp.de.debian.org/debian stretch main" >> /etc/apt/source.list
RUN apt-get update && apt-get install -y openjdk-8-jre openjdk-8-jdk
# Clang 8 as a compiler
RUN apt-get update && apt-get install -y \
  xz-utils \
  build-essential \
  curl \
  && rm -rf /var/lib/apt/lists/* \
  && curl -SL http://releases.llvm.org/8.0.0/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz \
  | tar -xJC . && \
  mv clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04 clang_8.0.0 && \
  echo 'export PATH=/clang_8.0.0/bin:$PATH' >> ~/.bashrc && \
  echo 'export LD_LIBRARY_PATH=/clang_8.0.0/lib:LD_LIBRARY_PATH' >> ~/.bashrc

#
RUN apt-get update
#install sdkman 
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get -qq -y install curl wget unzip zip
RUN curl -s "https://get.sdkman.io" | bash
RUN source "$HOME/.sdkman/bin/sdkman-init.sh"

#install gradle
RUN yes | /bin/bash -l -c 'sdk install gradle 6.1'

PS: Это cpp проект

Ответы [ 3 ]

1 голос
/ 27 января 2020

Позвольте мне сначала немного очистить этот Dockerfile:

FROM debian:stretch

RUN echo "deb http://ftp.de.debian.org/debian stretch main" >> /etc/apt/source.list
RUN apt-get update -y && apt install -qq -y \
      python3-dev libncurses5-dev libxml2-dev \
      libedit-dev swig doxygen graphviz xz-utils ninja-build \
      openjdk-8-jre openjdk-8-jdk \ 
      xz-utils curl git build-essential wget unzip zip

# Clang 8 as a compiler
RUN curl -SL http://releases.llvm.org/8.0.0/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz \
  | tar -xJC . && \
  mv clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04 clang_8.0.0 && \
  echo 'export PATH=/clang_8.0.0/bin:$PATH' >> ~/.bashrc && \
  echo 'export LD_LIBRARY_PATH=/clang_8.0.0/lib:LD_LIBRARY_PATH' >> ~/.bashrc

#install sdkman 
RUN ln -fs /bin/bash /bin/sh
RUN curl -s "https://get.sdkman.io" | bash
RUN source "$HOME/.sdkman/bin/sdkman-init.sh"
RUN yes | /bin/bash -l -c 'sdk install gradle 6.1'

RUN mkdir /src /work
WORKDIR /src
ENTRYPOINT gradle build -p /src

Важные биты внизу: он создает каталог /src и выполняет там gradle build. Вам остается только сделать этот каталог доступным при сборке.

Если вы создали контейнер один раз с docker build -t my-build-container ., вы можете запустить его следующим образом:

docker run -v $(pwd):/src my-build-container

В зависимости от ваша система сборки, это может привести к загрязнению вашего исходного дерева различными артефактами сборки, принадлежащими root. Если это так, рассмотрите возможность перехода к сборкам вне дерева, изменив вместо этого рабочий каталог по умолчанию на /work. Все результаты сборки будут go до /work, и вы можете извлечь их из контейнера позже.

1 голос
/ 27 января 2020

Вы можете создать образ docker из задач Gradle, используя **com.bmuschko:gradle-docker-plugin:3.1.0 plugin**

buildscript {
    repositories {
        jcenter()
                mavenCentral()
    }

    dependencies {
        classpath 'com.bmuschko:gradle-docker-plugin:3.1.0'
    }
}

apply plugin: 'com.bmuschko.docker-remote-api'

    import com.bmuschko.gradle.docker.tasks.image.Dockerfile
    import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
    import com.bmuschko.gradle.docker.tasks.image.*

    task buildImage(type: DockerBuildImage) {
            group = ''
            inputDir = file('.')
            tag = 'image name:'+tag
    }

для получения более подробной информации см. Документацию https://bmuschko.github.io/gradle-docker-plugin/

Создание образа из задачи Gradle - . / Gradlew имя задачи

Чтобы запустить контейнер и выполнить команду внутри него, вы можете использовать CMD или ENTRYPOINT и укажите команду в Dockerfile

CMD ["start. sh"]

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

0 голосов
/ 27 января 2020

Добавить docker сначала плагин

buildscript {
    dependencies {
        classpath("se.transmode.gradle:gradle-docker:1.2")
    }
}

создать простую задачу, подобную этой, в файле build.gradle

task buildDocker(type: Docker, dependsOn: build) {
    push = false
    project.group = 'testProject'
    project.archivesBaseName = jar.baseName
    applicationName = jar.baseName
    dockerfile = file('src/main/docker/Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...