【问题标题】:sed not working in dockerfile but in container bash it doessed 在 dockerfile 中不起作用,但在容器 bash 中起作用
【发布时间】:2020-04-27 06:32:38
【问题描述】:

我正在创建一个 Docker 映像,我在其中使用 sed 修改两个参数,但是当我创建映像并检查我想要修改的文件时,它仍然是相同的。如果我以交互方式运行 sed 命令,它就可以工作。为什么? sombebody 可以帮助我制作 ma 图像,而无需修改每个容器。

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 

【问题讨论】:

  • 您可以尝试在两次sed 操作之后将cat /etc/ssl/openssl.cnf 添加到Dockerfile 中。然后我们可以看看sed此时是否确实有效,但稍后会出现问题。
  • 感谢@bellackn 的建议,调试和发现问题很有用。

标签: bash image docker sed dockerfile


【解决方案1】:

我怀疑有些东西你没有看到或者你没有在你的问题中解释/描述。照原样,我无法重现您的问题。

我的 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)

注意:我忽略了差异退出状态并将其强制为 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

【讨论】:

  • 是的,你是对的,sed 确实在工作,这是我的一个小错误,当我仍然从映像 v1.0 运行容器时,我正在构建映像 ..v1.1。我整天都在试图解决这个问题。我复制了您的代码以确认 sed 在构建映像时确实有效,这对我帮助很大。谢谢你,对这个新手错误感到抱歉。
猜你喜欢
  • 2011-03-02
  • 2011-09-04
  • 1970-01-01
  • 2021-10-12
  • 2017-12-24
  • 2012-06-30
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多