前言
如果你是一個python自動化測試人員,某天你在公司終於完成了一個項目的接口自動化腳本工作,在你自己常用的本機或者服務器上調試完成了腳本,穩穩地沒問題。
可是晚上下班回家,你自己找了個linux的服務器,想在家里也練練手,於是重新安裝python3.6版本,網上找個教程巴拉巴拉的一大堆指令安裝。
第二天你回到公司,領導說你這個腳本能不能放到另外一套環境的服務器上執行(與你本機環境是不通的),於是你又重復安裝一遍python3.6環境和執行腳本的一些依賴包。
運氣好還能聯網pip在線安裝,運氣不好,都不能連接外網,只能本地安裝。於是乎你開始懷疑人生,為什么我要重復安裝這么多次環境啊。。。。
要是100個不同服務器,我是不是得安裝100次啊,於是乎你會想:我是不是可以做一個虛擬的python3.6環境,事先安裝好我需要的依賴包。
把做好的虛擬環境傳到某個倉庫(類似github),哪個機器需要用到,就一鍵導入過去就ok了,於是docker制作自己的鏡像文件勢在必行了,這就是今天要說的Dockerfile制作一個屬於自己的鏡像文件。
Dockerfile簡介
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
簡單來說,Dockerfile就是把我們安裝環境的每個步驟和指令,放到一個文件,最后一鍵執行,最后做成一個你想要的環境。
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
Docker構建三步曲:
- 編寫dockerfile文件
- docker build 構建image鏡像文件
- docker run 運行容器
Dockerfile相關指令
Dockerfile 是一個包含創建鏡像所有命令的文本文件,通過docker build命令可以根據 Dockerfile 的內容構建鏡像,
在介紹如何構建之前先介紹下 Dockerfile 的基本語法結構。
Dockerfile 有以下指令選項:
- FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的
- MAINTAINER 鏡像維護者的姓名和郵箱地址
- RUN 容器構建時需要運行的命令
- CMD 指定一個容器啟動時要運行的命令。dockerfile中可以有多個CMD指令,但只有最后一個生效,CMD會被docker run之后的參數替換。
- EXPOSE 當前容器對外暴露的端口號
- ENV 用來在構建鏡像過程中設置環境變量
- ADD 將宿主機目錄下的文件拷貝到鏡像里面並且ADD命令會自動處理URL和解壓tar壓縮包
- COPY COPY:類似ADD,拷貝文件和目錄到鏡像中,但是它只是拷貝,不會自動處理URL和解壓tar壓縮包。
- ENTRYPOINT 指定一個容器啟動時要運行的命令。ENTRYPOIT的目的和CMD一樣,都是在指定容器啟動程序及參數。
- VOLUME 容器數據卷,用於數據保存和持久化工作
- USER 指定運行容器時的用戶名或UID,后續的 RUN 也會使用指定用戶
- WORKDIR 指定在容器創建后,終端默認登錄進來工作目錄,一個落腳點
- ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承后,父鏡像的onbuild被觸發。
Dockerfile編寫
在當前目錄新建一個文件夾docker-run, cd進入到文件夾,touch新建一個Dockerfile,然后vi打開文件,開始編輯
[root@yoyo ~]# mkdir docker-run
[root@yoyo ~]# cd docker-run/
[root@yoyo docker-run]# touch Dockerfile
[root@yoyo docker-run]# vi Dockerfile
編輯內容如下:
# 基於python3.6.8鏡像
FROM python:3.6.8
MAINTAINER yoyo <283340479@qq.com>
# 更新pip
RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
# 工作目錄
WORKDIR /code
ADD . /code
# pip安裝依賴包
RUN pip install -r requirements.txt --index-url https://pypi.douban.com/simple
# 傳遞參數
ENTRYPOINT ["pytest"]
# 默認顯示help幫助信息
CMD ["--help"]
requirements.txt
requirements.txt是python的相關依賴包, 可以通過freeze命令生成
pip3 freeze >requirements.txt
[root@yoyo docker-run]# cat requirements.txt
pytest==3.6.3
requests==2.20.1
build構建鏡像文件
docker build 命令用於使用 Dockerfile 創建鏡像。OPTIONS說明:
-
-f :指定要使用的Dockerfile路徑;
-
--pull :嘗試去更新鏡像的新版本;
-
--quiet, -q :安靜模式,成功后只輸出鏡像 ID;
-
--tag, -t: 鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。
-t參數設置鏡像名稱yoyo_pytes和tag標簽名稱v1,注意最后面有個點.
docker build -t yoyo_pytest:v1 .
[root@yoyo docker-run]# docker build -t yoyo_pytest:v1 .
Sending build context to Docker daemon 11.78kB
Step 1/8 : FROM python:3.6
---> cfcdf565ff94
Step 2/8 : MAINTAINER yoyo <283340479@qq.com>
---> Using cache
---> f523b919fcf9
Step 3/8 : RUN pip install --upgrade pip
---> Using cache
---> 3399b50dab4e
Step 4/8 : WORKDIR /code
---> Using cache
---> 7223a20e17fd
Step 5/8 : ADD . /code
---> 650b554ccd6c
Step 6/8 : RUN pip install -r requirements.txt
---> Running in 0e49d444f7d8
運行過程中可以看到按步驟運行,如:Step 1/8
運行完成后,可以通過docker images查看生成的鏡像
[root@yoyo docker-run]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yoyo_pytest v1 6b4267ce7ac4 21 seconds ago 1.02GB
[root@yoyo docker-run]#
run運行容器
在當前目錄新建一個test_h.py文件,寫入pytest測試腳本
import pytest
# ** 作者:上海-悠悠 QQ交流群:717225969**
def test_one():
print("正在執行----test_one")
x = "this"
assert 'h' in x
def test_two():
print("正在執行----test_two")
x = "hello"
assert x
def test_three():
print("正在執行----test_three")
a = "hello"
b = "hello world"
assert a in b
if __name__ == "__main__":
pytest.main(["-s", "test_h.py"])
使用docker run運行容器
- -it -t讓docker分配一個偽終端並綁定到容器的標准輸入上, -i則讓容器的標准輸入保持打開.
- --rm 容器退出時,自動清除容器。 --rm選項不能與-d同時使用
- -v 將容器的工作目錄/code掛載到宿主機的$PWD,也就是當前目錄
- yoyo_pytest:v1 容器名稱和tag名稱
- test_h.py 后面跟着需要執行的腳本名稱
[root@yoyo docker-run]# docker run -it --rm -v "$PWD":/code yoyo_pytest:v1 test_h.py -s
================================================================== test session starts ==================================================================
platform linux -- Python 3.6.9, pytest-3.6.3, py-1.7.0, pluggy-0.6.0
rootdir: /code, inifile:
collected 3 items
test_h.py 正在執行----test_one
.正在執行----test_two
.正在執行----test_three
.
=============================================================== 3 passed in 0.01 seconds ================================================================
[root@yoyo docker-run]#
python接口QQ群:717225969