【问题标题】:Running commands in a Docker file在 Docker 文件中运行命令
【发布时间】:2017-10-03 18:27:15
【问题描述】:

当我在 Docker 文件中包含以下命令时,出现错误。我正在尝试创建一个 docker 文件来为 Redis 创建我的基础映像,并且此命令有助于提高 redis 性能。

RUN echo 4096 > /writable-proc/sys/net/core/somaxconn

当我尝试构建 docker 文件以创建图像时遇到的错误是:

/bin/sh: 1: cannot create /writable-proc/sys/net/core/somaxconn: Directory nonexistent

关于如何运行此命令的任何建议?我实际上想在我的 Dockerfile 中运行以下命令:

RUN echo 4096 > /writable-proc/sys/net/core/somaxconn
RUN echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled

以下是我的 Redis 映像的整个 Docker 文件:

#Download base image ubuntu 16.04
FROM ubuntu:14.04
MAINTAINER George Chilumbu

ENV HOME /root
ENV DEBIAN_FRONTEND noninteractive
#ENV /writable-proc/sys/net/core/somaxconn /proc:/writable-proc

# Set the working directory to /app
WORKDIR ~/

# Redis Cache Server Tuning
RUN mkdir -p /writable-proc/sys/net/core/somaxconn
RUN echo 4096 > /writable-proc/sys/net/core/somaxconn
#RUN echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
#RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled

# Install some necessary software/tools
RUN apt-get update && apt-get install -y \
    wget \
    vim \
    unzip \
    inetutils-ping \
    inetutils-tools \
    net-tools \
    dnsutils \
    software-properties-common \
    python-software-properties \
    ntp \
    rsyslog \
    curl

RUN add-apt-repository ppa:gaod/redis-server \
    && apt-get update \
    && apt-get install -y redis-server \
    redis-sentinel \
    && rm /etc/redis/redis.conf \
    && rm /etc/redis/sentinel.conf


RUN mkdir -p /opt/redis/redis_dump
RUN chown redis:redis -R /opt/redis/redis_dump/

【问题讨论】:

  • 您是否尝试过以特权身份运行它? stackoverflow.com/questions/26177059/…
  • 尝试运行基础镜像并检查目录 /writable-proc/sys/net/core/ 是否存在?否则,在添加文件和文本之前首先创建该目录。
  • 发布完整的 Dockerfile 可能会有所帮助。否则就是猜谜游戏。我猜你之前打电话给USER somethingecho...
  • 我已经添加了我的整个 Dockerfile。

标签: docker redis dockerfile


【解决方案1】:

只能在运行时使用 --sysctl 选项设置 sysctl。来自 docker-run(1) 手册:

   Configure namespaced kernel parameters at runtime

   IPC Namespace - current sysctls allowed:

   kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced
     Sysctls beginning with fs.mqueue.*

   If you use the --ipc=host option these sysctls will not be allowed.

   Network Namespace - current sysctls allowed:
         Sysctls beginning with net.*

   If you use the --network=host option these sysctls will not be allowed.

例如,对于 /proc/sys/net/core/somaxconn,您可以使用 --sysctl net.core.somaxconn=4096

procfs 和 sysfs 中的其他内核参数可能会被继承(尽管其他的不是),因此您应该在主机上设置它们。

【讨论】:

  • 谢谢里卡多。那行得通。如何为“echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf”和“echo never > /sys/kernel/mm/transparent_hugepage/enabled”做类似的事情?
  • 尝试在host中设置,看看这些参数是否被继承。作为最后的手段,我会尝试以特权模式运行容器(可能禁用 apparmor/selinux 和 seccomp)。也可以试试最新版本的 Docker 并告诉我们结果。
  • 我在 Docker 论坛上发现了很多关于这个主题的讨论。显然,这无法完成,如果您在主机级别执行此操作,它“可能”适用于该主机上的所有 docker 容器。我想我可以在容器内手动运行这些命令。谢谢里卡多。
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多