6

我需要在容器上设置 ulimits。例如,docker run --ulimit memlock="-1:-1" <image>。但是,在 Compute Engine 上部署容器优化的 VM 时,我不确定如何执行此操作,因为它会处理容器的启动。

我可以使用 --privileged、-e 用于环境变量,甚至是覆盖 CMD 之类的选项来部署 VM。如何部署为容器设置了 ulimits 的 VM?

4

3 回答 3

5

我收到了官方回复:

不幸的是,Compute Engine 上的容器功能目前不支持为容器设置 ulimit 选项。

一种解决方法是在容器内设置 ulimit。例如:gcloud beta 计算实例 create-with-container INSTANCE --zone=ZONE --container-image=gcr.io/google-containers/busybox --container-privileged --container-command=sh --container-arg =-c --container-arg=ulimit\ -n\ 100000

不幸的是,这种方法需要以特权身份运行容器。

最好的祝福,...

这个回复给了我做以下事情的灵感。创建一个从 docker 映像的 ENTRYPOINT 引用的包装脚本。在此包装脚本中,在启动受 ulimit 约束的进程之前设置 ulimit。

举个简单的例子:

$HOME/example/wrapper.sh

#! /bin/bash

# set memlock to unlimited
ulimit -l unlimited

# start the elasticsearch node 
# (found this from the base images dockerfile on github)
/usr/local/bin/docker-entrypoint.sh eswrapper

$HOME/example/Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2
COPY wrapper.sh .
RUN chmod 777 wrapper.sh
ENTRYPOINT ./wrapper.sh

本地镜像构建

docker image build -t gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0 $HOME/example

部署到 gcr.io

docker push gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0

通过 gcloud 创建实例

gcloud beta compute instances create-with-container example-instance-1 \
    --zone us-central1-a \
    --container-image=gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0 \
    --container-privileged \
    --service-account={DEFAULT_COMPUTE_ENGINE_SERVICE_ACC_ID}-compute@developer.gserviceaccount.com \
    --metadata=startup-script="echo 'vm.max_map_count=262144' > /etc/sysctl.conf; sysctl -p;"

请注意以下事项。上面的启动脚本只需要运行这个镜像的容器。服务帐户对于从您的私有 google 容器注册表中提取是必需的。--container-privileged 参数是必要的,因为需要以特权运行容器才能在其中设置 ulimit。

验证 ulimits 是否为您的进程设置

在 vm HOST 上,ps -e找到在包装脚本中执行的进程的 PID。在这种情况下,查找命令为 java 的 PID。对于每个 PID cat /proc/{PID}/limits,. 在这种情况下,我只将 memlock 设置为无限制。您可以看到它确实设置为无限。

于 2018-08-22T00:16:27.693 回答
4

在创建容器优化操作系统时或在配置选项以运行容器的文档中似乎没有设置 ulimit的文档。

目前,似乎不支持在部署容器优化 VM 时自动设置容器的 ulimit 选项,如此此处的文档中所示。您可以在此处的“计算”下提交功能请求。配置选项以运行容器的文档也不包括。

但是,您可以在 Container-Optimized OS (COS) 实例上运行容器。因此,您可以运行一个设置 ulimit 的 docker,如下所示

于 2018-08-21T18:33:36.967 回答
0

我已经成功使用了以下内容。

从 VM 内部或容器优化操作系统的启动脚本:

sudo echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf
sudo sysctl -p
于 2020-09-23T22:51:03.317 回答