背景介紹
平時我們的python,springboot工程啟動時加入一些引數,可以修改某些配置,增加部署的靈活性。
比如啟動一個springboot工程jar包的命令
java -jar server.jar --spring.profiles.active=test
複製程式碼
表示springboot啟動的配置檔案時test環境配置檔案
那如果我們把這些服務都打包到了docker映象中,如何在docker run命令中增加一些輸入引數。 docker 中生成docker映象的兩種方式是docker commit 與dockerfile ,這裡主要分享通過dockerfile構建的映象,如何再執行時輸入引數。
通過docker commit方式構建的映象,暫時不清楚如何輸入引數,待後續補充
Dockerfile檔案的構成
首先說一下Dockerfile檔案的結構
# 第一句表明基礎映象
FROM python:2.7-slim
# 設定工作目錄
WORKDIR /app
# 複製指定的src到容器中,也可以使用COPY
ADD . /app
# run指令在基礎映象中執行,只在打包的時候執行一次
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 暴露埠
EXPOSE 80
# 定義環境變數,會被後續的RUN命令使用,並且在容器執行期間保持
ENV NAME World
# 制定啟動容器時執行的命令,如果指定多條CMD,只有最後一條會執行,如果指定了ENTRYPOINT,會覆蓋CMD
CMD ["python", "app.py"]
# ENTRYPOINT會覆蓋上行
ENTRYPOINT ["sh","-c","java -jar server.jar --spring.profiles.active=test "]
複製程式碼
那一般的啟動映象的命令為
docker run -d -p 8080:80 --name xxxx static_web
-d表示後臺執行
-p指定埠對映
--name指定映象名稱
複製程式碼
查詢run方法的說明,我們可以看到很多其他的輸入引數
語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
複製程式碼
其中OPTIONS
-a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
-d: 後臺執行容器,並返回容器ID;
-i: 以互動模式執行容器,通常與 -t 同時使用;
-p: 埠對映,格式為:主機(宿主)埠:容器埠
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name="nginx-lb": 為容器指定一個名稱;
--dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一致;
--dns-search example.com: 指定容器DNS搜尋域名,預設和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設定環境變數;
--env-file=[]: 從指定檔案讀入環境變數;
--cpuset="0-2" or --cpuset="0,1,2": 繫結容器到指定CPU執行;
-m :設定容器使用記憶體最大值;
--net="bridge": 指定容器的網路連線型別,支援 bridge/host/none/container: 四種型別;
--link=[]: 新增連結到另一個容器;
--expose=[]: 開放一個埠或一組埠;
複製程式碼
可以看到docker run 命令允許輸入環境變數,我們通過環境變數,再dockefile中就可以獲取到相應的變數值。
-e username="ritchie": 設定環境變數;
--env-file=[]: 從指定檔案讀入環境變數;
複製程式碼
通過 docker run -e 輸入多個自定義變數
修改上面的dockerfile的最後幾句
# 定義環境變數,會被後續的RUN命令使用,並且在容器執行期間保持
# 配置檔案引數,預設為test環境
ENV PROFILES="test"
# java啟動引數,預設為空
ENV PARAMS=""
ENTRYPOINT ["sh","-c","java $PARAMS -jar server.jar --spring.profiles.active=$PROFILES "]
複製程式碼
同時配合run命令輸入環境變數:
docker run -d -p 8080:80 --name xxxx -e PARAMS="myParams" -e PROFILES="myProfiles" static_web
複製程式碼
即可修改與覆蓋ENTRYPOINT控制程式碼中的相應變數。
下面用一個最簡單的例子來說明。用play-with-docker來進行快速實驗最合適:
play-with-docker地址 Dockerfile內容:
執行結果:這樣就實現了docker映象輸入引數
通過docker run --env-file 從檔案中匯入多個環境變數
當我們的引數較多需要根據環境變動較大時,同樣也可以使用
--env-file=[]: 從指定檔案讀入環境變數;
複製程式碼
修改上述dockerfile
結果: 參考: