容器化应用通常是如何被配置:
容器中运行的完整指令由两部分组成:命令与参数。了解ENTRYPOINT与CMD。
这样, 镜像可以直接运行, 无须添加任何参数
docker run <image>
是添加一些参数, 覆盖Dockerile中任何由CMD指定的默认参数值
docker run <image> <arguments>
了解shell与exec形式的区别,上述两条指令均支持以下两种形式,两者的区别在于指定的命令是否是在shell中被调用。:
docker exec -it e4bad ps x
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /bin/sh -c node app. J s
7 ? Sl 0:00 node app.js
13 ? Rs+ 0:00 ps x
可以看出,主进程(Pid 1)是shell进程而非node进程,node进程(PID 7)在shell中启动。 shell进程往往是多余的,
在fortune脚本中添加VARIABLE变量并用第一个命令行参数对其初始化。
#!/bin/bash
trap "exit" SIGINT
INTERVAL=$1
echo Configured to generate new fortune every $INTERVAL seconds
mkdir -p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
修改fortune镜像的Dockerfile
FROM ubuntu:latest
RUN apt-get update ; apt-get -yinstall fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh"] exec 形式的ENTRYPOINT
CMD ["10"] 可执行程序的默认参数
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/ command"] 命令一般很少被覆盖
args: ["argl", "arg2", "arg3"]
少量参数值的设置可以使用上述的数组表示。多参数值情况下可以采用如下标
记。字符串值无须用引号标记,数值需要。
args:
- foo
- bar
- "15"
为pod中的每一个容器都指定自定义的环境变量集合。
#!/bin/bash
trap "exit" SIGINT
移除脚本中工NTERVAL初始化所在的行即可
# INTERVAL=$1
echo Configured to generate new fortune every $INTERVAL seconds
mkdir -p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
在pod中指定环境变量,环境变量被设置在pod的容器定义中,并非是pod级别。
kind: Pod
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERVAL
value: "30"
name: html-generator
在环境变量值中引用另二个变量,SECOND_VAR 的值是 foobar
env:
- name : FIRST_VAR
value: "foo"
- name : SECOND_VAR
value :”$(FIRST_VAR)bar”
Kubemetes 将配置选项分离到单独的资源对象 ConfigMap 中, 本质上就是键值对映射,值可以是短字面量,也可以是完整的配置文件。
创建了叫作 fortune-config的ConfigMap ,仅包含单映射条目 sleep interval=25
kubectl create configmap fortune-config --from-literal=sleep-interval=25
kubectl get configmap fortune-config -o yaml
apiVersion: vl
data :
sleeo-interval :”25 ” 描述符定义了一个ConfigMap
kind :ConfigMap
metadata
creationTimestamp: 2016 08-11T20 : 31:08Z
name: fortune-config 通过这个名称引用 ConfigMap
namespace: default
resourceVersion : ” 910025 ”
selfLink: /api/vl/namespaces/default/configmaps/fortune -config
uid: 88c4167e-6002-lle6-a50d-42010af00237
然后通k8s API 创建对应的ConfigMap
kubectl create - f fo tune config.yaml
ConfigMap 创建自多种选项:完整文件夹、单独文件、自定义键名的条目下的文件(替代文件名作键名) 及字面量。
apiVersion : vl
kind: Pod
metadata:
name: fortune-env-from- configrmap
spec:
containers:
- image : luksa/fortune:env
env:
- name : INTERVAL
valueFrom :
configMapKeyRef: ConfigMap初始化,不设定固定值
name:fortune-config 引用configMap 的名称
key: sleep-interval
Secret 结构与 ConfigMap类似, 均是键/值对的映射。 Secret 的使用方法也与
ConfigMap 相同, 可以
? 将 Secret 条目作为环境变量传递给容器
? 将 Secret 条目暴露为卷中的文件