国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java程序制作Docker Image推薦方案

dayday_up / 2558人閱讀

摘要:如果你用的是新建用戶命令是這樣的如果你用的是或者新建用戶命令是這樣的然后使用指令后面的指令就都是以用戶身份執(zhí)行了指定程序的接口對于聯(lián)網(wǎng)應用而言,必須在中指定暴露的端口,否則該端口無法映射。詳見參考文檔命令教程

原文地址

本文源代碼是一個spring-boot應用(在 https://github.com/chanjarste... ),不過本例子適用于所有Java應用。

要求

這里先給出一些Docker Image制作的要求,之后我們再看怎么做。

制作過程要融合在項目構(gòu)建過程中

使用官方Image作為基礎Image

設定正確的時區(qū)

Container內(nèi)的程序以非root用戶啟動

指定Web程序的端口

能夠傳遞JVM參數(shù)、Java System Properties、程序自定義的參數(shù)

下面具體講一下具體怎么做到以上幾點:

制作過程要融合在項目構(gòu)建過程中

這里推薦使用Spotify的dockerfile-maven-plugin,理由是這個plugin用起來最簡單且容易掌握。

該plugin的本質(zhì)上是你寫一個Dockerfile(關于Dockerfile的具體寫法請參照官方文檔),這個plugin把一些參數(shù)傳遞進去來幫助你構(gòu)建Docker Image。

因此只要你會寫Dockerfile,就會使用這個plugin,它沒有加入任何額外的概念。

使用官方Image作為基礎Image

Java的基礎鏡像應該在openjdk repository里尋找,而不是在已經(jīng)過時的java repository里找。

openjdk repository提供了各種各樣的image tags看起來眼花繚亂,但是本質(zhì)上來說就這么幾個:

openjdk:

openjdk:-slim

openjdk:-alpine

關于一般來說指定大版本號就行了,比如你可以在Dockerfile這樣寫:

FROM openjdk:8-alpine

從尺寸上來講,alpine最小、slim稍大、默認的最大。所以應該盡可能的使用alpine版本的,如果發(fā)現(xiàn)程序的運行環(huán)境缺少某些東西,那么嘗試用slim版本或者默認版本。就目前的經(jīng)驗來講:

如果需要操作系統(tǒng)字體庫,那么就得使用slim版本或者默認版本。需要操作系統(tǒng)字體庫的程序例如:圖片驗證碼、PDF導出。

如果需要某些Linux標準的動態(tài)/靜態(tài)連接庫,那么在alpine版本不行的情況下,嘗試slim版本或默認版本。因為alpine版本是一個及其精簡的Linux,它刪除了很多東西。

設定正確的時區(qū)

幾乎所有的Docker Image的時區(qū)都是UTC,我們需要給我們自己制作的Docker Image設定時區(qū):

ENV TZ=Asia/Shanghai
RUN set -eux; 
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; 
    echo $TZ > /etc/timezone

如果是alpine系列的則要安裝tzdata:

ENV TZ=Asia/Shanghai
RUN set -eux; 
    apk add --no-cache --update tzdata; 
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; 
    echo $TZ > /etc/timezone

關于數(shù)據(jù)庫時區(qū)的相關內(nèi)容可以見:

數(shù)據(jù)庫時區(qū)那些事兒 - MySQL的時區(qū)處理

數(shù)據(jù)庫時區(qū)那些事兒 - Oracle的時區(qū)處理

Container內(nèi)的程序以非root用戶啟動

在Docker Image內(nèi)部,我們應該使用非root用戶啟動程序,這需要新建用戶。

如果你用的是openjdk:-alpine新建用戶命令是這樣的:

RUN set -eux; 
    addgroup --gid 1000 java-app; 
    adduser -S -u 1000 -g java-app -h /home/java-app/ -s /bin/sh -D java-app;

如果你用的是openjdk:-slim或者openjdk:新建用戶命令是這樣的:

RUN set -eux; 
    addgroup --gid 1000 java-app; 
    adduser --system --uid 1000 --gid 1000 --home=/home/java-app/ --shell=/bin/sh --disabled-password java-app;

然后使用Dockerfile USER指令

USER java-app

# 后面的指令就都是以java-app用戶身份執(zhí)行了
指定Web程序的接口

對于聯(lián)網(wǎng)應用而言,必須在Dockerfile中指定暴露的端口,否則該端口無法映射。

EXPOSE 8080
能夠傳遞JVM參數(shù)、Java System Properties、程序自定義的參數(shù)

我們需要能夠在啟動Docker Image的時候?qū)⒁恍﹨?shù)傳遞進去:

JVM參數(shù)

Java System Properties

程序啟動參數(shù)

這里就需要參考Dockerfile best practice和Docker ENTRYPOINT了。

樣例項目拆解 目錄結(jié)構(gòu)

所有與程序相關的東西都存放在/home/java-app/下:

/home/java-app
   ├── docker-entrypoint.sh
   ├── lib
   │   └── java-app.jar
   ├── etc
   ├── logs
   └── tmp

docker-entrypoint.sh,啟動腳本

lib,存放JAR包

lib/java-app.jar,程序JAR包

etc,存放配置文件

logs,存放日志文件

tmp,存放臨時文件

構(gòu)建Image的方法
mvn clean package dockerfile:build
運行

普通啟動,然后訪問http://localhost:8080

docker run -p 8080:8080 chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT

設定JVM參數(shù)/System Properties,使用JAVA_OPTS環(huán)境變量:

docker run -p 8080:8080 -e JAVA_OPTS="-Xmx128M -Xms128M -Dabc=xyz -Ddef=uvw" chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT

提供程序運行參數(shù),在后面直接添加即可:

docker run -p 8080:8080 chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT --debug
2018-12-27更新

docker-entrypoint.sh里啟動Java進程時,使用exec /usr/bin/java ...這種形式,保證進程PID=1,這樣在進程能夠在docker stop時收到SIGTERM
詳見:docker stop

參考文檔

Dockerfile best practice

Docker ENTRYPOINT

Postgres Dockerfile & script

MySQL Dockerfile & script

Bash set命令教程

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27462.html

相關文章

  • Java程序制作Docker Image推薦方案

    摘要:如果你用的是新建用戶命令是這樣的如果你用的是或者新建用戶命令是這樣的然后使用指令后面的指令就都是以用戶身份執(zhí)行了指定程序的接口對于聯(lián)網(wǎng)應用而言,必須在中指定暴露的端口,否則該端口無法映射。詳見參考文檔命令教程 原文地址 本文源代碼是一個spring-boot應用(在 https://github.com/chanjarste... ),不過本例子適用于所有Java應用。 要求 這里先給...

    xuhong 評論0 收藏0
  • Docker極簡入門:使用Docker運行Java程序

    摘要:完成之后運行命令你的輸出可能會像這樣和都為,這是因為剛剛在編寫時沒有指定它們。多階段構(gòu)建鏡像多階段構(gòu)建鏡像其實運行程序只需要就行,我們沒有必要使用作為基礎鏡像。但把程序打包成包,然后再交給的方式太麻煩了。運行簡單的Java程序先在當前目錄創(chuàng)建App.java文件public class App{ public static void main(String[] args){ ...

    番茄西紅柿 評論0 收藏2637
  • 飛馳在Mesos的渦輪引擎上

    摘要:方案二和也運行在中。新增刪除節(jié)點變更配置均需要手工介入。公司已有的大多都是容器形式部署在各個服務器上。目前我們在每個節(jié)點上部署了傳統(tǒng)的。在接下來的階段團隊也會對此做進一步的探索。 回想起第一次接觸Mesos, 當時有很多困惑: 這到底是用來做啥的?跟YARN比有什么優(yōu)勢?有哪些大公司在使用么?。 然而現(xiàn)在技術日新月異地發(fā)展, Mesos這個生態(tài)圈也開始被越來越多的團隊熟悉關注, 像k8...

    xorpay 評論0 收藏0
  • 進入docker的世界

    摘要:反過來別的上的鏡像,也不能在樹莓派上運行。如果需要找樹莓派專用的鏡像,那就在上搜索或相關就能找到了。有一個叫的倉庫制作了非常多樹莓派專用,可以參考下。樹莓派安裝,最難的在于正確的選擇源和添加,才能找到版本適合的并下載。 最近學習Machine Learning發(fā)現(xiàn)好多人都用docker,之前一直聽說但是感覺和自己無關。但是現(xiàn)在發(fā)現(xiàn)原來docker是個這么方便的東西,可以跨平臺(不分什么...

    remcarpediem 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<