上一篇文章已經把任務的基本用法都介紹完畢,不過還有一些小細節需要討論。所以就用這一篇簡短的討論一下關於任務的一些細節部分。
在 Concourse 每次執行任務的時候都是產生一個新的容器,而這個容器會由我們所指定的 image_resource
來作為基礎的檔案系統。
當我們透過 run
來執行指令的時候,我們的工作目錄(Concourse 執行指令的資料夾)會含有從 inputs
所指定的資料,如果沒有資料被輸入進來的話,這個任務就不會被執行。
和 inputs
相同的是,每次執行任務也會放入一個用於 outputs
的空目錄,我們可以將這次任務的產出放到裡面,並且傳遞給下一個任務使用。
不過,如果你執行的指令是沒有產出檔案的。像是使用 git
的話,我們就可以透過 git clont ./input ./output
的方式,將檔案從輸入的目錄轉移到輸出的目錄之中。
在上一篇文章提到的 params
參數,我們已經知道會轉換為環境變數。這些環境變數會跟我們設定的 image_resource
內建的環境變數合併起來,像是從 Dockerfile
的 ENV
指令。
而執行指令的使用者預設是從 image_resource
指令的鏡像所設定的(一般是 Dockerfile
的 USER
所指定)在沒有指定的時候,則會以 root
作為預設的使用者。
另一個相關的設定則是 privileged
也就是表示這個任務會有「完整」的權限,就如同使用 root
執行任務一般。大多數時候都不應該由任務將其設定為 true
這有可能會因為輸入的檔案中含有 Concourse 的任務,而不小心啟動不應該運行的任務,而造成安全性上的問題。
最後,再用一個範例來解釋上面這些細節。
---
platform: linux
image_resource:
type: docker-image
source:
repository: golang
tag: '1.6'
params:
SOME_PARAM: some-default-value
inputs:
- name: some-input
- name: some-input-with-custom-path
path: some/custom/path
outputs:
- name: some-output
run:
path: sh
args:
- -exc
- |
whoami
env
go version
find .
touch some-output/my-built-artifact
這些指令會產生下面的輸出:
+ whoami
root
預設為 root
使用者。
+ env
USER=root
HOME=/root
GOLANG_DOWNLOAD_SHA256=5470eac05d273c74ff8bac7bef5bad0b5abbd1c4052efbdbc8db45332e836b0b
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GOPATH=/go
PWD=/tmp/build/e55deab7
GOLANG_DOWNLOAD_URL=https://golang.org/dl/go1.6.linux-amd64.tar.gz
GOLANG_VERSION=1.6
SOME_PARAM=some-default-value
在 Dockerfile
指定的環境變數會被設定進去,並且額外加上我們自訂的 SOME_PARAM
環境變數。
+ go version
go version go1.6 linux/amd64
使用的平台為 linux
(透過 go version
指令來觀察)
+ find .
.
./some-input到裡面。
./some-input/foo
./some
./some/custom
./some/custom/path
./some/custom/path/bar
./some-output
+ touch some-output/my-built-artifact
最後我們可以觀察到指定的 inputs
被作為目錄放到工作目錄中。
而也會有一個 outputs
的目錄存在,並且可以寫入一些檔案到裡面。
上述這個範例檔可以用前面提到過的 fly execute
指令直接執行,而不需要透過建立 Pipeline 的方式。
下一篇會針對 Pipeline 的部分做討論。