배포된 인스턴스 간에 다른 설정, 외부 시스템에 액세스하기 위한 자격 증명 등을 애플리케이션에 전달하는 방법이 필요하다.
이미지에 정의된 기본 명령만이 아닌 다른 명령을 실행하는 법
컨테이너에서 실행되는 명령어는 command와 argument 두 부분으로 구성되어있다.
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
Dockerfile 명령어 정의 부분
docker run <image>
or docker run <image> <arguments>
명령이 셸 내부에서 호출되는지의 차이
$ docker exec -it e4bad ps x
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /bin/sh -c node app.js
7 ? Sl 0:00 node app.js
13 ? Rs+ 0:00 ps x
$ docker exec 4675d ps x
PID TTY STAT TIME COMMAND
1 ? Ssl 0:00 node app.js
12 ? Rs 0:00 ps x
fortune 이미지에서 실행 간격을 조정
#!/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
FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh"]
CMD ["10"]
$ docker run -it <image>
$ docker run -it docker.io/luksa/fortune:args
Configured to generate new fortune every 10 seconds
Fri May 19 10:39:44 UTC 2017 Writing fortune to /var/htdocs/index.html
$ docker run -it <image> <arg>
$ docker run -it docker.io/luksa/fortune:args 15
Configured to generate new fortune every 15 seconds
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/command"]
args: ["arg1", "arg2", "arg3"]
apiVersion: v1
kind: Pod
metadata:
name: fortune2s
spec:
containers:
- image: luksa/fortune:args
args: ["2"]
name: html-generator
volumeMounts:
- name: html
mountPath: /var/htdocs
args:
- "2"
- foo
pod의 각 컨테이너에 대한 사용자 정의 환경 변수 목록을 지정할 수 있다.
#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERVAL seconds
kind: Pod
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERVAL
value: "30"
name: html-generator
➕ 각 컨테이너에서는 동일한 네임스페이스에 있는 각 서비스의 환경 변수를 자동으로 노출한다.
$(VAR) 구문을 사용하여 참조 가능
env:
- name: FIRST_VAR
value: "foo"
- name: SECOND_VAR
value: "$(FIRST_VAR)bar"
프로덕션과 개발 pod를 개별로 정의해야할 필요가 있을 때 설정을 분리해서 작성한다면 비효율적