Sed не работает в Dockerfile, но в контейнере bash это делает - PullRequest
2 голосов
/ 09 января 2020

Я создаю Docker изображение, в котором я использую sed для изменения двух параметров, но когда я создаю изображения и проверяю файл, я хотел изменить его, то же самое остается. Если я в интерактивном режиме запускаю команду sed, она работает. Почему? Может ли кто-нибудь помочь мне заставить ма образ работать без необходимости изменять каждый контейнер?

Dockerfile

FROM python:slim-buster

WORKDIR /home/scr_dca

COPY . . 

ENV FLASK_APP Screenly.py

RUN apt-get update && \
    apt install curl gnupg -y && \
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
    curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
    apt-get update && ACCEPT_EULA=Y apt-get install msodbcsql17 unixodbc-dev -y && \
    apt-get install libgssapi-krb5-2 g++ gcc && \
    pip3 install -r requirements.txt --trusted-host pypi.python.org 

RUN sed -i "s/\(MinProtocol *= *\).*/\1TLSv1.0 /" "/etc/ssl/openssl.cnf" && \
    sed -i "s/\(CipherString *= *\).*/\1DEFAULT@SECLEVEL=1 /" "/etc/ssl/openssl.cnf" 

CMD ["gunicorn", "-b", ":8000", "scr_dca:app"]

Я делаю

docker run --name mycontainer -d -p 5050:8000 src_dca_v1.0 
docker container exec -it mycontainer bash
:/home/myapp#  cat /etc/ssl/openssl.cnf

Я проверял, что sed не работал во время создания образа, поэтому я выполнил следующие команды:

sed -i "s/\(MinProtocol *= *\).*/\1TLSv1.0 /" "/etc/ssl/openssl.cnf"
sed -i "s/\(CipherString *= *\).*/\1DEFAULT@SECLEVEL=1 /" "/etc/ssl/openssl.cnf"

оригинальная часть файла, которую я хочу изменить:

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = @SECLEVEL=1

sed ожидаемый результат

[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1 

1 Ответ

1 голос
/ 09 января 2020

Я подозреваю, что вы что-то не видите или не объяснили / не описали в своем вопросе. Я не могу воспроизвести вашу проблему.

Мой MCVE, вдохновленный вашим текущим вопросом для проверки:

FROM python:slim-buster

RUN cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.ORI && \
    sed -i "s/\(MinProtocol *= *\).*/\1TLSv1.0 /" "/etc/ssl/openssl.cnf" && \
    sed -i "s/\(CipherString *= *\).*/\1DEFAULT@SECLEVEL=1 /" "/etc/ssl/openssl.cnf" && \
    (diff -u /etc/ssl/openssl.cnf.ORI /etc/ssl/openssl.cnf || exit 0)

Примечание. выйдет со статусом 1, когда есть разница между файлами, которые не смогут выполнить сборку.

И результат:

$ docker build --no-cache -t test:test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM python:slim-buster
 ---> 3d8f801fc3db
Step 2/2 : RUN cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.ORI &&     sed -i "s/\(MinProtocol *= *\).*/\1TLSv1.0 /" "/etc/ssl/openssl.cnf" &&     sed -i "s/\(CipherString *= *\).*/\1DEFAULT@SECLEVEL=1 /" "/etc/ssl/openssl.cnf" &&     (diff -u /etc/ssl/openssl.cnf.ORI /etc/ssl/openssl.cnf || exit 0)
 ---> Running in 523ddc0f4025
--- /etc/ssl/openssl.cnf.ORI    2020-01-09 16:21:44.667348574 +0000
+++ /etc/ssl/openssl.cnf    2020-01-09 16:21:44.675348574 +0000
@@ -358,5 +358,5 @@
 system_default = system_default_sect

 [system_default_sect]
-MinProtocol = TLSv1.2
-CipherString = DEFAULT@SECLEVEL=2
+MinProtocol = TLSv1.0 
+CipherString = DEFAULT@SECLEVEL=1 
Removing intermediate container 523ddc0f4025
 ---> 88c28529ceb5
Successfully built 88c28529ceb5
Successfully tagged test:test

Как видите, diff показывает различия до / после запуска sed и ожидаемых вами изменений.

Мы также можем убедиться, что эти изменения сохраняются при запуске контейнера из этого образа:

$ docker run -it --rm --name testcmd test:test bash -c "grep -A 2 '\[system_default_sect\]' /etc/ssl/openssl.cnf"
[system_default_sect]
MinProtocol = TLSv1.0 
CipherString = DEFAULT@SECLEVEL=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...