2019年1月2日 星期三

[elasticsearch] Elasticsearch docker file java.nio.file.AccessDeniedException 權限修改

如果是用 elasticsearch docker 使用 -v 掛載 docker volumes 時,
Use volumes | Docker Documentation https://docs.docker.com/storage/volumes/
可能會發現出現權限不足的訊息。

# docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /data/pces:/usr/share/elasticsearch/data docker.elastic.co/elasticsearch/elasticsearch:6.5.4


Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes

當然,如果沒有其他考量可以 # chmod 777 /data/pces

如果,佈署 docker 的遠端機器並沒有這樣的權限,可以使用 docker 的 entrypoint 來改變資料夾權限。
在 Dockerfile 中, RUN 是 build images 時,會運行的指令,一個 Dockerfile 中可以寫下多條的RUN指令。
CMD 與 ENTRYPOINT 則是,運行 container 時會執行的指令,只有最後一條會生效,
所以,一般會把 ENTRYPOINT 執行的指令寫成一個 sh file 。大部分的位置在 /usr/local/bin/docker-entrypoint.sh


CMD
支援三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦使用;
CMD command param1 param2 在 /bin/sh 中執行,使用在給需要互動的指令;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設參數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。
如果使用者啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
指定容器啟動後執行的命令,並且不會被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個會生效。

由於使用了 Elasticsearch 官方的 Dockerfile 裏面已經有封裝了 docker-entrypoint.sh。
所以,在自己的 docker file 內使用了 sed -i 去修改 /usr/local/bin/docker-entrypoint.sh

```
RUN sed -i '3i\chmod -R 777 /usr/share/elasticsearch/data' /usr/local/bin/docker-entrypoint.sh

```

elasticsearch/docker-entrypoint.sh at deabc2adbaa9251213071e5b46c6742ab781dc84 · docker-library/elasticsearch https://github.com/docker-library/elasticsearch/blob/deabc2adbaa9251213071e5b46c6742ab781dc84/docker-entrypoint.sh

使用 RUN 在 build images 時,添加了更改目錄權限的指令,然後,container 跑起來時會使用 root 運行 docker-entrypoint.sh ,藉此更改在遠端機器的資料夾權限。



``` Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.3
COPY --chown=elasticsearch:elasticsearch elasticsearch/elasticsearch.yml /usr/share/elasticsearch/config/
WORKDIR /usr/share/elasticsearch
RUN bin/elasticsearch-plugin install --batch discovery-ec2 && sed -e '/^-Xm/s/^/#/g' -i /usr/share/elasticsearch/config/jvm.options
RUN sed -i '3i\chmod -R 777 /usr/share/elasticsearch/data' /usr/local/bin/docker-entrypoint.sh

```

```
cat elasticsearch/elasticsearch.yml                                           
cluster.name: "search_ecs"
# node.name: ${NODENAME}
bootstrap.memory_lock: false
network.host: 0.0.0.0
network.publish_host: _ec2:privateIp_
transport.publish_host: _ec2:privateIp_
discovery.zen.hosts_provider: ec2
discovery.zen.minimum_master_nodes: 2
discovery.ec2.tag.Name: ecs
discovery.ec2.endpoint: ec2.us-west-2.amazonaws.com
cloud.node.auto_attributes: true
cluster.routing.allocation.awareness.attributes: aws_availability_zone
xpack.security.enabled: false

```

沒有留言:

張貼留言