我正在重构一个有角度的应用程序,以从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
中启动一个新容器,并在命令行中手动粘贴所有指令,并且效果很好。
整个Docker容器的重点应该是抽象化环境并为您的应用程序创建独立的环境,那么为什么相同的Dockerfile蓝图在我的机器上完美运行而在我的机器上却不能正常运行? 另外,docker恶魔也可以正常运行并启动容器,而在容器内部进行系统升级时,我们遇到的问题是这样。
这完全让我震惊,我什至可以理解这两种不同的机器问题,但是我找不到对此的任何逻辑解释:相同的命令馈送给命令行工作,但如果通过脚本执行则无法执行。
答案 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