gpt4 book ai didi

docker - 如何在 Docker 镜像中写入文件?

转载 作者:行者123 更新时间:2023-12-02 20:37:07 26 4
gpt4 key购买 nike

我已将文件复制到 docker 镜像中:

COPY dbconfig.xml /var/app/dbconfig.xml

之后,我尝试将文件中的一些值替换为:
RUN sed -i "s/PASSWD/$dbpasswd/" /var/app/dbconfig.xml

注意 $dbpassword 是一个 ENV 变量。

当我检查 config.xml 的内容时,通过启动该图像的容器并在其中运行 bash,dbconfig.xml 中没有任何变化。

现在我想我误解了 docker 图像的一些基础知识..

我什至测试了创建一个简单的文件:
RUN echo "test" > newfile.txt

通话后似乎被删除了..
我知道每个 运行 语句创建 新图层在声明之后它被删除(?)。

我很困惑。为什么像安装软件这样的东西
RUN apt-get install -y some-package

不会被删除并且创建一个简单的文件会被删除吗?

那么..如何在镜像构建时更改 docker 镜像中的文件?

Dockerfile :
FROM dchevell/jira-software:8.0

COPY dbconfig.xml /var/atlassian/application-data/jira/dbconfig.xml
WORKDIR /var/atlassian/application-data/jira

# set default password to admin
ENV dbpasswd=admin

RUN sed -i "s/PASSWD/$dbpasswd/" dbconfig.xml \
&& cat dbconfig.xml

RUN echo "test" > newfile.txt

dbconfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<jira-database-config>
<name>defaultDS</name>
<delegator-name>default</delegator-name>
<database-type>postgres72</database-type>
<schema-name>public</schema-name>
<jdbc-datasource>
<url>jdbc:postgresql://docker-postgres:5432/jiradb</url>
<driver-class>org.postgresql.Driver</driver-class>
<username>atlasdb</username>
<password>PASSWD</password>
<pool-test-while-idle>true</pool-test-while-idle>
</jdbc-datasource>
</jira-database-config>

更新 1

令人困惑的是,当我在 WORKDIR 文件夹中复制某些内容时,它仍然存在,但是当我随后尝试使用 SED 对其进行修改时,这些更改不会持续存在!我认为背景中有一些真正的黑暗魔法正在发生..
也许我尝试将我预先配置的 dbconfig.xml 绑定(bind)到 docker-compose 中,看看是否有帮助..

更新 2

来自 Docker Documentation :

Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded.



我完全错过了!感谢 David 将我指向那里:) 所以创建和编写文件确实可以按预期工作,但要小心 VOLUME 目录。 RUN 语句在这里不起作用。
因此,要解决此问题,最佳做法是将文件绑定(bind)到该卷中。

最佳答案

如果你看the Dockerfile for that base image , 它部分表示

ENV JIRA_HOME /var/atlassian/application-data/jira
VOLUME ["${JIRA_HOME}"]

在 Dockerfile 中执行 VOLUME 语句后, later Dockerfile statements can't make any more changes in that specific directory .

鉴于您尝试更改的各种设置是特定于安装的设置(管理员密码、数据库设置),我不会尝试使用这些设置镜像。相反,我会使用 docker run -v在运行时注入(inject)配置文件的选项。

关于docker - 如何在 Docker 镜像中写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54882078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com