我需要在容器上设置 ulimits。例如,docker run --ulimit memlock="-1:-1" <image>
。但是,在 Compute Engine 上部署容器优化的 VM 时,我不确定如何执行此操作,因为它会处理容器的启动。
我可以使用 --privileged、-e 用于环境变量,甚至是覆盖 CMD 之类的选项来部署 VM。如何部署为容器设置了 ulimits 的 VM?
我需要在容器上设置 ulimits。例如,docker run --ulimit memlock="-1:-1" <image>
。但是,在 Compute Engine 上部署容器优化的 VM 时,我不确定如何执行此操作,因为它会处理容器的启动。
我可以使用 --privileged、-e 用于环境变量,甚至是覆盖 CMD 之类的选项来部署 VM。如何部署为容器设置了 ulimits 的 VM?
我收到了官方回复:
不幸的是,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。
举个简单的例子:
#! /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
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
docker push gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0
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。
在 vm HOST 上,ps -e
找到在包装脚本中执行的进程的 PID。在这种情况下,查找命令为 java 的 PID。对于每个 PID cat /proc/{PID}/limits
,. 在这种情况下,我只将 memlock 设置为无限制。您可以看到它确实设置为无限。
我已经成功使用了以下内容。
从 VM 内部或容器优化操作系统的启动脚本:
sudo echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf
sudo sysctl -p