2

我有一个作为 .bin 的应用程序包,它在 rhel7-init 基本映像上运行。以下是带有父镜像和子镜像的 Dockerfile。

FROM registry.access.redhat.com/rhel7-init:7.3 as base
COPY yum.repos.d/ /etc/yum.repos.d/
RUN yum -y install sudo systemd
RUN yum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-redhat93-9.4-3.noarch.rpm -y && \
 yum install -y postgresql94
RUN export key=value && \
    installer.bin &> /root/install.log

FROM registry.access.redhat.com/rhel7-init:7.3
COPY --from=base /opt/app/ /opt/app
COPY start_app /root/
RUN chmod +x /root/start_app
ENTRYPOINT [ "/root/start_app" ]

它有一个以 ENTRYPOINT 形式给出的启动脚本,它在启动容器时在运行时配置一些东西。我将安装的目录位置从父图像复制到新图像。

现在,当我启动容器时,它会显示对安装在父映像中的 sudo 包的依赖关系。

如何在不增加太多大小的情况下将已安装的父基础映像的包转移到我的新基础映像?

我还可以继承父基础映像中使用的安装程序中存在的任何环境变量吗?

4

2 回答 2

1

您可以通过写入文件并将其复制到下一个图像中来从父图像转发环境变量等。然后在你的入口点以某种方式读取它并导出变量等。但我会说它有点异国情调的设计。

但在你的情况下,似乎对变量和包有相当多的依赖,所以也许根本不使用多阶段更容易?

于 2018-08-19T18:42:41.670 回答
0

这是一个老问题,但我会尝试解决这两个问题。

从父阶段重用 Linux 依赖项

这应该可以通过定义一个安装依赖项的公共基础阶段来实现。例子:

FROM ubuntu as base

RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get -qq -y install postgresql

FROM base as stage0
RUN which psql
# psql still here, should print /usr/bin/psql

FROM base as stage1
RUN which psql 
# psql still here, should print /usr/bin/psql

从父阶段重用环境变量

这有点棘手,但可能。一些选项包括:

  1. 使用环境变量创建一个文件并用于COPY --from从另一个阶段复制文件
  2. 在基础阶段创建一个包含环境变量的文件,并在所有阶段重用该文件。
  3. 按照这里的建议使用全局 ARG

1) 应该是最清楚的,因为与问题中发布的 Dockerfile 相比没有什么新东西。它只是一个按需创建并复制到稍后阶段的额外文件。

2) 考虑到它与针对 Linux 依赖项显示的解决方案非常相似,也应该很简单。在基础阶段创建的文件应该在所有FROM base阶段都可用。

3)在提到的链接中有很好的解释,但为了完整起见,应该是这样的(请参阅链接了解更多详细信息):

ARG my_key=my_value

FROM ubuntu as stage1
ARG my_key
RUN echo $my_key
# should print my_value

FROM ubuntu as stage2
ARG my_key
RUN echo $my_key
# should print my_value

如果您需要将环境变量公开给正在运行的容器,您可以使用ENV该值并将其提供给它ARG

ARG my_key
ENV key=$my_key
CMD ["sh", "-c", "echo $key"]
# should print my_value
于 2020-06-05T14:04:36.897 回答