Невозможно запустить команду sysctl в Dockerfile - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь создать свой первый докер-файл (я новичок в этом), и мне нужно, чтобы система выполнила команду sysctl -w kernel.randomize_va_space=0 (это лабораторная среда), но я получаю ошибку:

sysctl: настройка ключа "kernel.randomize_va_space": файловая система только для чтения

Всякий раз, когда я пытаюсь собрать файл Docker, есть какие-либо предложения, как это обойти?

FROM avatao/lesp:ubuntu-14.04

USER root

COPY ./solvable/ /

RUN sysctl -w kernel.randomize_va_space=0

VOLUME ["/tmp"]

EXPOSE 2222

WORKDIR /home/user/

USER user

CMD ["/usr/sbin/sshd", "-Df", "/etc/ssh/sshd_config_user"]

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Это ожидается, так как Docker ограничивает доступ к /proc и /sys (для безопасности).По сути, чтобы добиться того, что вы пытаетесь, вам нужно либо дать пользователю CAP_SYS_ADMIN, либо запустить в привилегированном режиме, ни один из которых не разрешен в течение build, см. { issue }.

В настоящее время, если вы можете запускать эти вещи после запуска контейнера, вы можете использовать либо флаг --cap-add=SYS_ADMIN, либо --privileged.В идеале, это не то, что мы бы делали в производственной системе, но вы, похоже, работаете в лабораторной установке.Если вы делаете это на этапе run, я бы рекомендовал сначала попробовать флаг --sysctl, но он поддерживает только подмножество команд, и я не уверен, что он позволит вам изменить настройки ядра.

0 голосов
/ 23 февраля 2019

Поскольку контейнеры Docker совместно используют ядро ​​хост-системы и его настройки, контейнер Docker обычно вообще не может запускать sysctl.(Вы особенно не можете отключить критичные для безопасности настройки, подобные этой.) Вы можете установить ограниченное количество sysctl для локального контейнера с помощью docker run --sysctl, но тот, который вы упомянули, не тотиз них.

Кроме того, вы также не можете форсировать подобные изменения в Dockerfile.Образ Docker содержит только файловую систему и некоторые связанные метаданные, а не какие-либо запущенные процессы или настройки хост-системы.Даже если это RUN sysctl сработает, если вы перезагрузите систему, а затем запустите контейнер из образа, этот параметр будет потерян.

Учитывая то, что вы показали в этом Dockerfile - настраиваемые параметры ядра Linux, нетконкретное запущенное приложение, открытый ssh-демон в качестве процесса контейнера - вы можете подумать, подходит ли виртуальная машина вашим потребностям лучше.Вы можете использовать такой инструмент, как Packer , чтобы воспроизводимо создать образ виртуальной машины почти так же, как Dockerfile создает образ Docker.Поскольку у VM есть изолированное ядро, вы можете запустить там команду sysctl, и она будет работать, возможно, с помощью обычных методов полной установки Linux, таких как /etc/sysctl.conf файл.

...