首页 > 解决方案 > 覆盖 Docker 容器中的文件

问题描述

我在 docker 容器中运行 jira8:

jira8:
  container_name: jira8
  expose:
    - "8080"
  image: atlassian/jira-software:8.10
  networks:
    atlassian-network:
      aliases:
        - jira8
  ports:
    - "8081:8080"
  restart: always
  volumes:
    - /Users/mles/git/jira-migration/config-files/server-localhost-8.10.xml:/opt/atlassian/jira/conf/server.xml

每次我重新启动 docker 容器时,该文件/Users/mles/git/jira-migration/config-files/server-localhost-8.10.xml都会被/opt/atlassian/jira/conf/server.xmljira8 docker 容器中存在的文件覆盖。

我可以 - 在容器启动后 - 将server-localhost-8.10.xml手动复制到 docker 容器中,覆盖默认的server.xml.

我尝试安装只读(:ro

  volumes:
    - /Users/mles/git/jira-migration/config-files/server-localhost-8.10.xml:/opt/atlassian/jira/conf/server.xml:ro

但我在主机上的文件仍然被覆盖。

有一个更好的方法吗?前任 使挂载的文件只读并始终覆盖 docker 容器中存在的文件?

标签: docker

解决方案


您需要使用此映像的本机设置系统,或对其进行大量修补。

该镜像有一个Docker Hub 页面(通常,https://hub.docker.com/r/owner/image用于非库镜像)。该链接指向其 Docker 打包源的 Bitbucket 存储库。主容器进程是一个无条件执行的entrypoint.py脚本

gen_cfg('server.xml.j2', f'{JIRA_INSTALL_DIR}/conf/server.xml')

gen_cfg函数将通过从引用的 Jinja2 源文件中呈现它来覆盖命名的输出文件。

Docker Hub 页面列出了大量的环境变量设置。如果您设置了这些,容器将为您生成自己的server.xml文件。如果你能弄清楚到底注入了什么,你也可以使用绑定挂载来覆盖server.xml.j2源文件。

(一般来说,在启动时绑定挂载总是将内容推送到容器中,并且从不从镜像中提取内容。这个镜像在生成自己的配置时有点不寻常,这就是主机文件被覆盖的原因;这不是自然发生的事情与 Docker。)


推荐阅读