在 Docker 文件中运行命令

Posted

技术标签:

【中文标题】在 Docker 文件中运行命令【英文标题】:Running commands in a Docker file 【发布时间】: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/

【问题讨论】:

您是否尝试过以特权身份运行它? ***.com/questions/26177059/… 尝试运行基础镜像并检查目录 /writable-proc/sys/net/core/ 是否存在?否则,在添加文件和文本之前首先创建该目录。 发布完整的 Dockerfile 可能会有所帮助。否则就是猜谜游戏。我猜你之前打电话给USER somethingecho... 我已经添加了我的整个 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 容器。我想我可以在容器内手动运行这些命令。谢谢里卡多。

以上是关于在 Docker 文件中运行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在容器中运行docker命令

如何在容器中运行docker命令

Docker 从入门到实践系列三 - Docker 常用命令

Docker 从入门到实践系列三 - Docker 常用命令

如何在 Docker compose 中运行一次命令

在docker下运行python