Docker flutter鏡像自動(dòng)部署實(shí)踐鸵熟,踩坑記錄

前言

本項(xiàng)目主要參考cirruslabs的兩個(gè)Docker腳本

本筆記主要是簡化和增加一些實(shí)際過程中一些經(jīng)驗(yàn)總結(jié)

最簡單實(shí)踐案例

指定SDK版本

Dockerfile

FROM cirrusci/android-sdk:tools

ENV ANDROID_PLATFORM_VERSION 29
ENV ANDROID_BUILD_TOOLS_VERSION 29.0.2

RUN yes | sdkmanager \
    "platforms;android-$ANDROID_PLATFORM_VERSION" \
    "build-tools;$ANDROID_BUILD_TOOLS_VERSION"

編譯鏡像爽蝴,和上面Dockerfile同級目錄執(zhí)行

docker build -t "image_name" . 
  • -t 指定鏡像名稱;
  • . 當(dāng)前目錄找Dockerfile 編譯文件

如果需要多個(gè)SDK的話养叛,可以在上次編譯鏡像的基礎(chǔ)上疊一層痹届,修改Dockfile

<font color=red>建議不要疊太多SDK幌衣,否則最終的鏡像會很大巷波,而且正式環(huán)境是不需要多個(gè)SDK的</font>

Dockerfile

FROM <上次編譯的鏡像名稱或者ID>

ENV ANDROID_PLATFORM_VERSION 29
ENV ANDROID_BUILD_TOOLS_VERSION 29.0.2

RUN yes | sdkmanager \
    "platforms;android-$ANDROID_PLATFORM_VERSION" \
    "build-tools;$ANDROID_BUILD_TOOLS_VERSION"

備注: 這里提供自己編譯好的SDK版本彰亥,本人比較懶提供常用編譯好的SDK

dockerlinz/android-sdk:29

dockerlinz/android-sdk:28

dockerlinz/android-sdk:27

指定flutter版本

Dockerfile

FROM dockerlinz/android-sdk:27

ARG flutter_version

ENV FLUTTER_HOME=${HOME}/sdks/flutter \
    FLUTTER_ROOT=$FLUTTER_HOME \
    FLUTTER_VERSION=$flutter_version \
    PUB_HOSTED_URL=https://pub.flutter-io.cn \
    FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

RUN mkdir -p ${FLUTTER_HOME}

ENV PATH ${PATH}:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin

RUN git clone --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME} && \
    flutter doctor

這里我們使用v1.9.1-hotfixes分支

docker build --tag --build-arg flutter_version=v1.9.1-hotfixes

測試

進(jìn)入flutter工程所在目錄

docker run --rm -it -v ${PWD}:/build --workdir /build dockerlinz/flutter:stable flutter build apk 

可以加入 -v ~/.gradle:/home/cirrus/.gradle --env GRADLE_USER_HOME=/home/cirrus/.gradle泪漂,掛在本地緩存到鏡像中

<font color=red> 注意:過來人經(jīng)驗(yàn)廊营,此處沒有把握的話還是進(jìn)入容器里面測試會更省事</font>

docker run --rm -it -v ${PWD}:/build --workdir /build dockerlinz/flutter:stable

進(jìn)入后需要重新生成.packages

fluter clean 
flutter packages get 

最好進(jìn)入android或mac目錄執(zhí)行以下原生編譯腳本,查看編譯環(huán)境

./gradlew build -d 

最后才是flutter編譯

flutter build apk 

出現(xiàn)的問題

問題一:本地正常跑萝勤,但是鏡像中很多依賴下載不下來

  • <font color=red> android studio Could not download guava.jar</font>
  • <font color=red> Could not download kotlin-gradle-plugin.jar</font>
  • <font color=red>flutter Build file '/build/android/app/build.gradle' line: 25</font>
  • <font color=red>Could not download kotlin-reflect.jar org.jetbrains.kotlin:kotlin-reflect:1.2.0</font>

解決:方案

  1. 在gradle中增加阿里云國內(nèi)鏡像

    buildscript {
        repositories {
            maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
            google()
            jcenter()
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:3.3.1'
        }
    }
    
    allprojects {
        repositories {
            maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
            google()
            jcenter()
        }
    }
    
  2. 掛載本地gradle 緩存到鏡像中

    docker run --rm -it -v ${PWD}:/build --workdir /build  -v ~/.gradle:/home/cirrus/.gradle --env GRADLE_USER_HOME=/home/cirrus/.gradle  dockerlinz/flutter:stable
    

問題二: flutter build apk 緩慢

每次都下載gradle版本露筒,導(dǎo)致每次重新下載gradle版本

解決方案一

掛在本地緩存到鏡像中

 -v ~/.gradle:/home/cirrus/.gradle --env GRADLE_USER_HOME=/home/cirrus/.gradle

解決方案二

  1. 掛在.gradle 緩存目錄,不用每次編譯的時(shí)候重新下載依賴

    -v ~/.gradle2:/home/cirrus/.gradle
    
  2. 在疊一層gradle環(huán)境

    #https://github.com/frekele/docker-gradle/blob/master/Dockerfile
    FROM dockerlinz/flutter:1.9.1-hotfixes
    
    # Change to tmp folder
    ENV GRADLE_VERSION=4.10.2
    ENV GRADLE_HOME=/opt/gradle
    ENV GRADLE_FOLDER=/root/.gradle
    
    # Change to tmp folder
    WORKDIR /tmp
    
    # Download and extract gradle to opt folder
    RUN wget --no-check-certificate --no-cookies https://downloads.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip \
        && sudo unzip gradle-${GRADLE_VERSION}-bin.zip -d /opt \
        && sudo ln -s /opt/gradle-${GRADLE_VERSION} /opt/gradle \
        && sudo rm -f gradle-${GRADLE_VERSION}-bin.zip
    
    # Add executables to path
    RUN sudo update-alternatives --install "/usr/bin/gradle" "gradle" "/opt/gradle/bin/gradle" 1 && \
        sudo update-alternatives --set "gradle" "/opt/gradle/bin/gradle"
    
    # Create .gradle folder
    RUN sudo mkdir -p $GRADLE_FOLDER
    
    # Mark as volume
    VOLUME  $GRADLE_FOLDER
    
    # Add the files
    #ADD rootfs /
    
    # Change to root folder
    WORKDIR /home/cirrus/
    
  3. Flutter 中Android工程指定本地gradle編譯敌卓,不是取下載慎式,文件目錄<android_project>/.idea/gradle.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project version="4">
      <component name="GradleSettings">
        <option name="linkedExternalProjectsSettings">
          <GradleProjectSettings>
            <compositeConfiguration>
              <compositeBuild compositeDefinitionSource="SCRIPT" />
            </compositeConfiguration>
            <option name="distributionType" value="LOCAL" />
            <option name="externalProjectPath" value="$PROJECT_DIR$" />
            <option name="gradleHome" value="$USER_HOME$/.gradle/wrapper/dists/gradle-4.4-all/9br9xq1tocpiv8o6njlyu5op1/gradle-4.4/bin" />
            <option name="resolveModulePerSourceSet" value="false" />
            <option name="testRunner" value="PLATFORM" />
          </GradleProjectSettings>
        </option>
      </component>
    </project>
    
    • distributionType 改為LOCAL
    • gradleHome 指向gradle_home/bin
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趟径,隨后出現(xiàn)的幾起案子瘪吏,更是在濱河造成了極大的恐慌,老刑警劉巖蜗巧,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掌眠,死亡現(xiàn)場離奇詭異,居然都是意外死亡幕屹,警方通過查閱死者的電腦和手機(jī)蓝丙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來香嗓,“玉大人迅腔,你說我怎么就攤上這事】坑椋” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵掠兄,是天一觀的道長像云。 經(jīng)常有香客問我,道長蚂夕,這世上最難降的妖魔是什么迅诬? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮婿牍,結(jié)果婚禮上侈贷,老公的妹妹穿的比我還像新娘。我一直安慰自己等脂,他們只是感情好俏蛮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布撑蚌。 她就那樣靜靜地躺著,像睡著了一般搏屑。 火紅的嫁衣襯著肌膚如雪争涌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天辣恋,我揣著相機(jī)與錄音亮垫,去河邊找鬼。 笑死伟骨,一個(gè)胖子當(dāng)著我的面吹牛饮潦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播携狭,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼继蜡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暑中?” 一聲冷哼從身側(cè)響起壹瘟,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳄逾,沒想到半個(gè)月后稻轨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雕凹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年殴俱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚抵。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡线欲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汽摹,到底是詐尸還是另有隱情李丰,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布逼泣,位于F島的核電站趴泌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拉庶。R本人自食惡果不足惜嗜憔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氏仗。 院中可真熱鬧吉捶,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滋早,卻和暖如春榄审,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杆麸。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工搁进, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昔头。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓饼问,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揭斧。 傳聞我的和親對象是個(gè)殘疾皇子莱革,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容