docker環境變數怎麼寫
環境變數引數environment
docker-compose。yml 檔案
其中有
environment
引數用來配置環境變數,
${REDIS_PASSWORD}
變數需要在
docker-compose。yml
同目錄下的
。env
檔案中設定從而傳參
v
、、ersion:
“3。8”
services:
flask:
build:
context: 。/flask
dockerfile: Dockerfile
image: flask-demo:latest
environment:
-
REDIS_HOST
=
redis-server
-
REDIS_PASS
=
networks:
-
backend
-
frontend
redis-server:
image: redis:latest
command: redis-server
——requirepass
networks:
-
backend
nginx:
image: nginx:stable-alpine
ports:
-
8000
:80
depends_on:
-
flask
volumes:
-
。/nginx/nginx。conf:/etc/nginx/conf。d/default。conf:ro
-
。/var/log/nginx:/var/log/nginx
networks:
-
frontend
networks:
backend:
frontend:
。evn
檔案
REDIS_PASSWORD=ABC123
驗證環境變數傳參結果
使用
docker-compose config
命令
指定env檔案
使用
docker-compose ——env-file <檔名>
docker-compose ——env-file myenv up -d
docker-compose ——env-file myenv config
——evn-file
必須緊跟在
docker-compose
Docker Compose-服務依賴和健康檢查
一、docker compose 服務依賴
使用depends_on關鍵字
version:
services:
flask:
build:
-
REDIS_HOST
=
-
REDIS_PASS
=
healthcheck:
test: [
“CMD”
,
“curl”
,
“-f”
,
“localhost:5000”
]
interval: 30s
timeout: 3s
retries:
3
start_period: 40s
-
redis-server
networks:
-
backend
-
frontend
networks:
-
backend
nginx:
ports:
-
8000
:80
flask:
condition: service_healthy
volumes:
-
-
networks:
-
frontend
networks:
backend:
frontend:
二、docker compose 健康檢查
健康檢查是容器執行狀態的高階檢查,主要是檢查容器所執行的程序是否能正常的對外提供“服務”,比如一個數據庫容器,我們不光 需要這個容器是up的狀態,我們還要求這個容器的資料庫程序能夠正常對外提供服務,這就是所謂的健康檢查。
容器的健康檢查
容器本身有一個健康檢查的功能,但是需要在Dockerfile裡定義,或者在執行docker container run 的時候,透過下面的一些引數指定
——
health
-
cmd
string
Command
to
run
to
check
health
——
health
-
interval
duration
Time
between
running
the
check
(
ms
|
s
|
m
|
h
) (
default
0
s
)
——
health
-
retries
int
Consecutive
failures
needed
to
report
unhealthy
——
health
-
start
-
period
duration
Start
period
for
the
container
to
initialize
before
starting
health
-
retries
countdown
(
ms
|
s
|
m
|
h
) (
default
0
s
)
——
health
-
timeout
duration
Maximum
time
to
allow
one
check
to
示例原始碼
我們以下面的這個flask容器為例,相關的程式碼如下
PS
C
:
\
Users
\
Peng
Xiao
\
code
-
demo
\
compose
-
env
\
flask
>
dir
目錄
:
C
:
\
Users
\
Peng
Xiao
\
code
-
demo
\
compose
-
env
\
flask
Mode
LastWriteTime
Length
Name
——
——————-
————
——
-
a
——
2021
/
7
/
13
15
:
52
448
app
。
py
-
a
——
2021
/
7
/
14
0
:
32
471
Dockerfile
PS
C
:
\
Users
\
Peng
Xiao
\
code
-
demo
\
compose
-
env
\
flask
>
more
。
\
app
。
py
from
flask
import
Flask
from
redis
import
StrictRedis
import
os
import
socket
app
=
Flask
(
__name__
)
redis
=
StrictRedis
(
host
=
os
。
environ
。
get
(
‘REDIS_HOST’
,
‘127。0。0。1’
),
port
=
6379
,
password
=
os
。
environ
。
get
(
‘REDIS_PASS’
))
@app
。
route
(
‘/’
)
def
hello
():
redis
。
incr
(
‘hits’
)
return
f“Hello Container World! I have been seen {redis。get(‘hits’)。decode(‘utf-8’)} times and my hostname is {socket。gethostname()}。\n”
PS
C
:
\
Users
\
Peng
Xiao
\
code
-
demo
\
compose
-
env
\
flask
>
more
。
\
Dockerfile
FROM
python
:
3。9。5
-
slim
RUN
pip
install
flask
redis
&&
\
apt
-
get
update
&&
\
apt
-
get
install
-
y
curl
&&
\
groupadd
-
r
flask
&&
useradd
-
r
-
g
flask
flask
&&
\
mkdir
/
src
&&
\
chown
-
R
flask
:
flask
/
src
USER
flask
COPY
app
。
py
/
src
/
app
。
py
WORKDIR
/
src
ENV
FLASK_APP
=
app
。
py
REDIS_HOST
=
redis
EXPOSE
5000
HEALTHCHECK
——
interval
=
30
s
——
timeout
=
3
s
\
CMD
curl
-
f
localhost
:
5000
/
||
exit
1
CMD
[
“flask”
,
“run”
,
“-h”
,
“0。0。0。0”
]
上面Dockerfili裡的
HEALTHCHECK
就是定義了一個健康檢查。 會每隔30秒檢查一次,如果失敗就會退出,退出程式碼是
1
構建映象和建立容器
構建映象,建立一個bridge網路,然後啟動容器連到bridge網路
$
docker
image
build
-
t
flask
-
demo
。
$
docker
network
create
mybridge
$
docker
container
run
-
d
——
network
mybridge
——
env
REDIS_PASS
=
abc123
flask
-
demo
檢視容器狀態
$
docker
container
ls
CONTAINER
ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
059
c12486019
flask
-
demo
“flask run -h 0。0。0。0”
4
hours
ago
Up
8
seconds
(
health:
starting
)
5000
/
tcp
dazzling_tereshkova
也可以透過
docker container inspect 059
檢視詳情, 其中有有關health的
“Health”: {“Status”: “starting”,“FailingStreak”: 1,“Log”: [ {“Start”: “2021-07-14T19:04:46。4054004Z”,“End”: “2021-07-14T19:04:49。4055393Z”,“ExitCode”: -1,“Output”: “Health check exceeded timeout (3s)” }]}
經過3次檢查,一直是不通的,然後
health
的狀態會從
starting
變為
unhealthy
docker container
ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
059c12486019 flask-demo
“flask run -h 0。0。0。0”
4
hours ago Up
2
minutes (unhealthy)
5000
/tcp dazzling_tereshkova
啟動redis伺服器
啟動
redis
,連到
mybridge
上,
name=redis
, 注意密碼
$ docker container run -d ——network mybridge ——name redis redis:latest redis-server ——requirepass abc123
經過幾秒鐘,我們的
flask
變成了
healthy
$
docker
container
ls
CONTAINER
ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
bc4e826ee938
redis:
latest
“docker-entrypoint。s…”
18
seconds
ago
Up
16
seconds
6379
/
tcp
redis
059
c12486019
flask
-
demo
“flask run -h 0。0。0。0”
4
hours
ago
Up
6
minutes
(
healthy
)
5000
/
tcp
dazzling_tereshkova
docker-compose 健康檢查
示例程式碼下載(flask healthcheck)
本節原始碼
示例程式碼下載(flask + redis healthcheck)
本節原始碼