LoginSignup
2
1

More than 5 years have passed since last update.

Libertyコンテナでumaskを変える

Last updated at Posted at 2018-11-14

Dockerコンテナとして稼働するWebSphere Libertyプロセスのumaskを変える方法を確認。

DockerfileRUN umask 0002としたり.bashrc等を設定しても、最終的にENTRYPOINTCMDでプロセスを起動する際にはログインシェルを介さないので、意味がないことに注意。

ENTRYPOINTとCMDの確認

ググると以下のような情報がある。

コンテナ内に以下の様なスクリプトをCOPYしてENTRYPOINTに指定している。

#!/bin/bash
umask 0002
/bin/bash

ベースとするイメージのENTRYPOINTCMDがどうなっているかにより、好ましい対応方法は異なると思われる。また、上記の記事の方法では親となるbashプロセスが余計に起動することになると思われる。

websphere-liberty:18.0.0.3-kernelのDockerfileを確認すると、ENTRYPOINTCMDは以下となっている。

ENTRYPOINT ["/opt/ibm/docker/docker-server"]
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]

ENTRYPOINTに指定されている/opt/ibm/docker/docker-serverLICENSEKEYSTORE_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に設定されていた内容を実行するスクリプトを作成する。

start.sh
#!/bin/bash
umask 0002
exec /opt/ibm/wlp/bin/server run defaultServer

実行権限を付与する。

chmod +x start.sh

Dockerfileは以下のようにする。

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のほうを変えてもよい。

custom-entrypoint.sh
#!/bin/bash
umask 0002
exec /opt/ibm/docker/docker-server "${@}"
Dockerfile
FROM websphere-liberty:latest
COPY custom-entrypoint.sh /
ENTRYPOINT ["/custom-entrypoint.sh"]
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]

Kuberenetesのマニフェストでの設定例

Kubernetes上で稼働させる場合で、Dokcerイメージ内にわざわざスクリプトを入れ込みたくない場合は、マニフェストで定義する事も可能。DockerfileのENTRYPOINTcommandに、CMDargsに相当する。

liberty.yaml
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
$

参考リンク

[docker] CMD とENTRYPOINT の違いを試してみた

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1