啟動docker的命令是docker run ******************
他有好多的參數,具體看 https://www.runoob.com/docker/docker-run-command.html,我們想要傳參的話使用的是 -e
需要注意的一點是docker run 命令后面內容的先后順序,必須 一定 要把鏡像名字放到最后!!!
舉個例子 : docker run -it -d --name my_container -e PARAMS="我是參數" my_image # 橙色這些參數位置隨意, 藍色(即鏡像名字一定放最后)
我們這里實現傳參是通過環境變量實現的,這里的 -e PARAMS="我是參數" ,PARAMS是在Dockerfile中指定的
我舉個簡單的例子 , 假設我要將tttt文件中的代碼創建docker,tttt文件中有ttt.py文件(啟動文件) ,此時 Dockerfile需要與tttt文件夾在同一目錄下
# ttt.py 如下
from sys import argv import os if "__main__"==__name__: print(argv[1]) print(type(argv[1])) print("Hello World!")
# Dockerfile 如下:
FROM docker.io/python:3.6MAINTAINER tianye # 設置容器時間 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone ENV LANG C.UTF-8 # 設置編碼 ENV PATH=$PATH:/usr/local/lib/python3.6/ ENV PYTHONPATH $PATH # 配置環境變量 ENV PARAMS="" # 給我們要傳的參數一個初始值 #代碼添加到code文件夾 ADD ./tttt/ /test/code/tttt/ #設置code文件夾為工作目錄 WORKDIR /test/code/tttt/ CMD python3 ttt.py $PARAMS
# 創建鏡像並啟動容器
docker build -t my_image . docker run -it -d --name my_container -e PARAMS="hahaha" my_image # my_image 放最后 這里hahaha 加不加引號 無所謂 docker logs -f --tail 200 my_container
Dockerfile中 最后一行 $PARAMS 會解析為一個變量獲取其值,也就是 docker run傳入的參數 "hahaha", 在python程序中通過 argv[1] 就可以獲取到我們傳入的"hahaha" !
!!!需要注意的一點是Dockerfile 中CMD的用法,如果我們不傳參那么寫法有很多
如: CMD ["python3", "ttt.py"] CMD [python3, ttt.py] CMD "python3" "ttt.py" CMD python3 ttt.py 都沒問題
但是要傳參的話: 我們的參數 $PARAMS 是萬萬不能用 " " 的,不然Dockerfile會認為是普通字符串
CMD ["python", "ttt.py", $PARAMS] (×) 原因可能是字符串和變量放到一個列表時,字符串優先級高,直接將 $PARAMS當作一個字符串處理
CMD [python3, ttt.py, $PARAMS] (×)
CMD "python3" "ttt.py" $PARAMS (√,推薦!)
CMD python3 ttt.py $PARAMS (√)
CMD [] 形式,中括號中 必須用逗號分割; 如果不用中括號,不能用逗號分割! OK 結束!
參考:https://blog.csdn.net/qq_38983728/article/details/98741935
https://www.runoob.com/docker/docker-run-command.html