Dockerfile sed命令记录

本文介绍如何构建 Airflow 的 Docker 镜像,并详细解释了如何通过修改源码使时间显示为本地时间的过程。涉及的步骤包括从特定仓库拉取镜像、设置环境变量、添加配置文件、安装依赖包以及使用 sed 命令精确修改时间显示相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FROM 172.16.1.60:5000/airflow-centos7-python3.6-base:latest

ENV AIRFLOW_HOME /opt/app/airflow-agent
ENV SLUGIFY_USES_TEXT_UNIDECODE yes
ENV GIT_DAGS git@gitlab.youxin.com:devops/airflow-dags.git
ENV MQ_QUEUE test-exchange-docker

#add airflow配置文件
ADD /conf/ /opt/app/airflow-agent
#添加git仓库key
ADD /ssh/ /root/.ssh

RUN pip3 install -r /opt/app/airflow-agent/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple\
    && sed -i -e '35s/ask/no/' -e '35s/#//' /etc/ssh/ssh_config \
    && chmod +x /opt/app/airflow-agent/run.sh \
    && chmod +x /opt/app/airflow-agent/run-worker.sh \
    && chmod 400 /root/.ssh/id_rsa \
    && sed -i -e '27afrom airflow import configuration as conf' -e '27atry:' -e '27a\ \ \ \ tz = conf.get("core", "default_timezone")' -e '27a\ \ \ \ if tz == "system":' -e '27a\ \ \ \ \ \ \ \ utc = pendulum.local_timezone()' -e '27a\ \ \ \ else:' -e '27a\ \ \ \ \ \ \ \ utc = pendulum.timezone(tz)' -e '27aexcept Exception:' -e '27a\ \ \ \ pass' -e '61c\ \ \ \ d = dt.datetime.now()' /usr/local/lib/python3.6/site-packages/airflow/utils/timezone.py \
    && sed -i -e '37afrom airflow import configuration as conf' -e '37atry:' -e '37a\ \ \ \ tz = conf.get("core", "default_timezone")' -e '37a\ \ \ \ if tz == "system":' -e '37a\ \ \ \ \ \ \ \ utc = pendulum.local_timezone()' -e '37a\ \ \ \ else:' -e '37a\ \ \ \ \ \ \ \ utc = pendulum.timezone(tz)' -e '37aexcept Exception:' -e '37a\ \ \ \ pass' /usr/local/lib/python3.6/site-packages/airflow/utils/sqlalchemy.py \
    && sed -i -e '31c\ \ \ \ var UTCseconds = x.getTime();' -e '34c\ \ \ \ \ \ \ \ "timeFormat":"H:i:s", ' /usr/local/lib/python3.6/site-packages/airflow/www/templates/admin/master.html

EXPOSE 8080
EXPOSE 8793

CMD ["/opt/app/airflow-agent/run.sh"]

在制作airflow docker镜像时,需要修改airflow源码,使其显示时间为本地时间,通过 sed命令可实现对镜像中文件的修改。

通过指定行号修改:

    在指定行号后增加内容:sed -i -e ‘行号a内容’ 文件路径

    替换指定行号的内容:sed -i -e ‘行号c内容’ 文件路径

    在指定行号前增加内容:sed -i -e ‘行号i内容’ 文件路径

也可以通过匹配内容进行修改:

    匹配行前修改:sed -i '/要匹配的内容/a修改后的内容' 文件路径

    匹配行后修改:sed -i '/要匹配的内容/i修改后的内容' 文件路径

    替换匹配行:sed -i '/要匹配的内容/c替换后的内容' 文件路径

### 如何从运行中的 Docker 容器提取或生成对应的 Dockerfile 要从一个正在运行的 Docker 容器中提取或生成其原始的 `Dockerfile`,可以采用多种方法实现。以下是几种常见的技术手段: #### 方法一:通过 `docker history` 提取构建命令 可以通过分析目标容器的历史记录来反向推导出可能使用的 `Dockerfile` 指令。具体操作如下: ```bash docker history <container_id_or_image_name> --format "{{.CreatedBy}}" --no-trunc=true \ | sed "s/\/bin\/sh -c #(nop)//g" | sed "s/\/bin\/sh -c/RUN/g" | tac ``` 上述脚本会解析容器历史记录,并将其转换为类似于 `Dockerfile` 的指令序列[^2]。 需要注意的是,这种方法仅适用于简单场景下的重建工作。如果原镜像是由复杂多阶段构建流程创建,则可能会丢失部分上下文信息。 #### 方法二:利用工具自动生成 Dockerfile 对于更复杂的案例或者希望获得更加精确的结果时,可借助专门设计用于逆向工程现有镜像至对应描述文件形式的应用程序完成此任务。例如 Inspectlet 或其他第三方插件能够帮助自动化这一过程。 另外,在某些情况下也可以考虑手动编写一个新的基于当前状态版本化后的基础映象之上增量更改而成的新版定义文档作为替代方案之一[^3]。 #### 特殊情况处理 – 私有仓库镜像下载失败问题解决办法 当遇到因网络原因导致无法直接获取特定位置存储(如Google Container Registry)内的资源实例时,可以选择寻找已迁移至公开可用平台上的副本进行拉取安装操作。比如针对cadvisor这类应用就可以执行下面这条语句来进行本地部署前准备活动: ```bash docker pull lagoudocker/cadvisor:v0.37.0 ``` 这一步骤确保即使面对受限连接环境也能顺利完成所需依赖项准备工作[^4]。 ### 总结说明 综上所述,虽然可以从已有实例出发尝试还原最初的配置脚本内容,但由于实际开发过程中往往存在诸多定制化调整因素影响最终产物形态,因此所得到结果未必完全一致于最初源码表述方式。但在多数常规需求范围内仍具有较高实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值