相同的Dockerfile在构建期间会产生不同的结果

时间:2019-01-31 15:10:07

标签: docker dockerfile

我正在重构一个有角度的应用程序,以从VM架构切换到Docker容器。

在为Angular构建容器时,我想出了一个Dockerfile用作多阶段构建中的构建器。我在Mac上像魅惑一样工作,所以我将其推到我们公司的github,以供同事使用。

当一位同事从回购中撤出并尝试在Mac上进行构建时,问题出现了(不同型号,但差不多可比,我是2015年,他是2016年,都运行Mojave)。

这是出错的dockerfile的内容:

# base image
FROM node:9.6.1 as builder

# install chrome for protractor tests
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update 
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:fontforge/fontforge
RUN apt-get install -y google-chrome-stable
RUN apt-get install -y  fontforge ttfautohint gettext 

我假设它可以像在笔记本电脑上那样很好地构建,但是当他尝试启动构建时,他在步骤RUN apt-get update中遇到了一些错误

在尝试更新systemd并退出时,容器得到404。

我们还尝试从相同的图像docker run --rm -it node:9.6.1 /bin/bash中启动一个新容器,并在命令行中手动粘贴所有指令,并且效果很好。

1。为什么在两个非常相似但仍然不同的机器中出现两个不同的结果?

整个Docker容器的重点应该是抽象化环境并为您的应用程序创建独立的环境,那么为什么相同的Dockerfile蓝图在我的机器上完美运行而在我的机器上却不能正常运行? 另外,docker恶魔也可以正常运行并启动容器,而在容器内部进行系统升级时,我们遇到的问题是这样。

2。为什么在同一台机器上,如果手动运行,则Dockerfile构建会失败,而相同的步骤会成功吗?

这完全让我震惊,我什至可以理解这两种不同的机器问题,但是我找不到对此的任何逻辑解释:相同的命令馈送给命令行工作,但如果通过脚本执行则无法执行。

1 个答案:

答案 0 :(得分:0)

apt-get update尤其会产生随时间变化的结果。其中包括指向Debian软件包的URL,标准的Debian软件包管理实践是,一旦有新版本,就从存储库列表中删除软件包。

如果您先前通过RUN apt-get update运行了Dockerfile,然后又更改了要安装的特定软件包,则可能会处于Docker缓存更新操作结果的状态,但是它们不是有效期更长。

通常的答案是确保在单个 apt-get update && apt-get install步骤中运行RUN

RUN apt-get update \
 && apt-get install -y software-properties-common
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN add-apt-repository -y ppa:fontforge/fontforge
RUN apt-get update \
 && apt-get install -y google-chrome-stable fontforge ttfautohint gettext