Dockerコンテナとして稼働するWebSphere Libertyプロセスのumask
を変える方法を確認。
Dockerfile
でRUN umask 0002
としたり.bashrc
等を設定しても、最終的にENTRYPOINT
やCMD
でプロセスを起動する際にはログインシェルを介さないので、意味がないことに注意。
ENTRYPOINTとCMDの確認
ググると以下のような情報がある。
コンテナ内に以下の様なスクリプトをCOPY
してENTRYPOINT
に指定している。
# !/bin/bash
umask 0002
/bin/bash
ベースとするイメージのENTRYPOINT
とCMD
がどうなっているかにより、好ましい対応方法は異なると思われる。また、上記の記事の方法では親となるbash
プロセスが余計に起動することになると思われる。
websphere-liberty:18.0.0.3-kernelのDockerfileを確認すると、ENTRYPOINT
とCMD
は以下となっている。
ENTRYPOINT ["/opt/ibm/docker/docker-server"]
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]
ENTRYPOINT
に指定されている/opt/ibm/docker/docker-server
はLICENSE
とKEYSTORE_REQUIRED
環境変数がある場合に何か処理をしたのち、最後は以下のように引数で与えられた内容をexec
している。
# Pass on to the real server run
exec "$@"
すなわちCMD
で指定された内容が実行され、/opt/ibm/docker/docker-server
のプロセスは終了する。
WLP_SKIP_UMASK
Libertyは環境変数WLP_SKIP_UMASK=true
を設定していない場合は、起動時にOtherのアクセス権を拒否するようにumaskを設定する挙動をすることに注意。
Dockerfileでの設定例
umask
を変更し、もともとCMD
に設定されていた内容を実行するスクリプトを作成する。
# !/bin/bash
umask 0002
exec /opt/ibm/wlp/bin/server run defaultServer
実行権限を付与する。
chmod +x start.sh
Dockerfile
は以下のようにする。
FROM websphere-liberty:latest
COPY start.sh /
CMD ["/start.sh"]
ビルドする。
docker build -t umask .
コンテナを起動し、ログファイルの権限が変わっていることと余計なプロセスがないことを確認。
$ docker run --rm -d --name liberty-umask umask
64c21c20f112c2b6b1d03bd4b571f80d7decf0577402b9beb3dd6fa8133f830a
$ docker exec -it liberty-umask ls -l /logs
total 12
-rw-rw---- 1 default root 11345 Nov 14 07:59 messages.log
$ docker exec -it liberty-umask ps -ef
UID PID PPID C STIME TTY TIME CMD
default 1 0 28 07:58 ? 00:00:15 /opt/ibm/java/jre/bin/java -java
default 292 0 0 07:59 pts/0 00:00:00 ps -ef
$
(umaskを変えない場合)
$ docker run --rm -d --name liberty websphere-liberty
78902882c748f7674ccfb02447d07f13caa10a0a95689fa62d9cc38c7f30da48
$ docker exec -it liberty ls -l /logs
total 12
-rw-r----- 1 default root 11345 Nov 14 07:59 messages.log
$ docker exec -it liberty ps -ef
UID PID PPID C STIME TTY TIME CMD
default 1 0 40 07:59 ? 00:00:14 /opt/ibm/java/jre/bin/java -java
default 221 0 1 07:59 pts/0 00:00:00 ps -ef
$
別の設定例
以下のようにCMD
ではなくENTRYPOINT
のほうを変えてもよい。
# !/bin/bash
umask 0002
exec /opt/ibm/docker/docker-server "${@}"
FROM websphere-liberty:latest
COPY custom-entrypoint.sh /
ENTRYPOINT ["/custom-entrypoint.sh"]
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]
Kuberenetesのマニフェストでの設定例
Kubernetes上で稼働させる場合で、Dokcerイメージ内にわざわざスクリプトを入れ込みたくない場合は、マニフェストで定義する事も可能。DockerfileのENTRYPOINT
がcommand
に、CMD
がargs
に相当する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: liberty
spec:
selector:
matchLabels:
app: liberty
replicas: 1
template:
metadata:
labels:
app: liberty
spec:
containers:
- name: liberty
image: websphere-liberty:kernel
imagePullPolicy: Always
ports:
- containerPort: 9080
args:
- bash
- -c
- |
umask 0002
exec /opt/ibm/wlp/bin/server run defaultServer
マニフェストをデプロイ。
kubectl apply -f liberty.yaml
確認する。
$ kubectl exec -it liberty-666b7c759c-hq8ss -- ps -ef
UID PID PPID C STIME TTY TIME CMD
default 1 0 8 09:19 ? 00:00:04 /opt/ibm/java/jre/bin/java -java
default 76 0 0 09:20 pts/0 00:00:00 ps -ef
$ kubectl exec -it liberty-666b7c759c-hq8ss -- ls -l /logs
total 4
-rw-rw---- 1 default root 2070 Nov 29 09:19 messages.log
$