【问题标题】:Docker image fails to build on Live but fine on DevDocker 镜像无法在 Live 上构建,但在 Dev 上很好
【发布时间】:2019-07-19 11:52:23
【问题描述】:

我对 Docker 有一个奇怪的问题。

这是有问题的 Dockerfile。

FROM python:2.7

RUN apt-get update && apt-get install -y \
    build-essential \
    python-lxml \
    python-dev \
    python-pip \
    python-cffi \
    libcairo2 \
    libpango1.0-0 \
    libpangocairo-1.0.0 \
    libxml2-dev \
    libxslt1-dev \
    zlib1g-dev \
    libpq-dev \
    libjpeg-dev \
    libgdk-pixbuf2.0-0 \
    libffi-dev \
    mysql-client \
    shared-mime-info

# ... further docker file rules, which doesn't get run cause apt-get fails

我遇到的问题是在我的开发机器上,这个 Dockerfile 构建 非常好,但是在我们的实时服务器上它突然失败了(在 过去),E: Package 'mysql-client' has no installation candidate

我认为 Docker 的意义在于一切都使用相同的映像运行,并且 你不应该遇到这样的问题。

为什么会出现这种情况,我该怎么做才能从这里修复它,以便它运行 开发版和直播版都一样吗?

【问题讨论】:

  • 您确定在生产服务器上没有代理的情况下可以访问 Internet 吗? apt(-get) update 的输出显示了什么?
  • 所有其他软件包都已下载并安装好。只有mysql-client,换句话说,如果我注释掉mysql-client,图像就会生成。
  • 如果你设置了一个 Docker 注册中心,并在那里 docker push 成功构建的镜像,那么远程系统可以 docker pull 它并且不必重复此步骤。
  • 在我的机器上也失败了。不确定你的开发机器是如何构建它的
  • “我认为 Docker 的意义在于一切都使用相同的映像运行”。这不是你在这里所做的:你正在重建图像。

标签: mysql docker dockerfile


【解决方案1】:

您正在使用带有标签2.7 的图像python,但是根据Python readme on Docker Hub,此标签是一个“共享” 标签,它在其他时间会发生变化:现在python:2.7 是共享的使用 Python python:2.7.16python:2,但以前它可能与 python:2.7.15python:2.7.14 等共享(换句话说,python:2.7 在升级时正在关注 python:2.7.x

您的机器和实时服务器可能在不同的时间提取了图像,现在有一个标记为2.7 的不同图像。 “共享”标签看起来像 latest 标签,并且可能指向新发布的图像。

你可以做什么:

  • 在构建时强制执行图像拉取,即使图像已经存在(使用 docker build with --pull 选项
  • 改用记录在案的简单标签,这些标签应该更加一致(例如python:2.7.16-alpine3.9
  • 不要在发布过程中重新构建镜像,只构建一次并在本地和实时环境中使用相同的镜像(见下文)

编辑:这可以通过以下方式证明:

docker images --filter "reference=python" --digests --format "{{.Digest}} {{.Repository}}:{{.Tag}}"
sha256:7a61a96567a2b2ba5db636c83ffa18db584da4024fa5839665e330934cb6b2b2 python:2
sha256:7a61a96567a2b2ba5db636c83ffa18db584da4024fa5839665e330934cb6b2b2 python:2.7
sha256:7a61a96567a2b2ba5db636c83ffa18db584da4024fa5839665e330934cb6b2b2 python:2.7.16
sha256:39224960015b9c0fce12e08037692e8a4be2e940e73a36ed0c86332ce5ce325b python:2.7.15

准确地说:

我认为 Docker 的意义在于一切都使用相同的方式运行 图像,你不应该遇到这样的问题。

为什么会出现这种情况,我可以从这里做些什么来修复它,以便它在 dev 和 live 上运行相同?

是的,推荐的模式是构建一次映像并在所有发布过程中使用同一个映像 - 这确保您从开发到拥有完全相同的上下文(包、代码等)生产。您不应在实时服务器上从头开始重新构建映像,而最好在开发阶段构建它并使用相同的映像进行测试和部署。

【讨论】:

  • 谢谢,这是一个很好的解释,没有考虑 --pull 选项。此外,您(和其他人)关于不重新构建映像的 cmets 非常有效,我将考虑更改部署过程以考虑到这一点。
【解决方案2】:

Python:2.7 现在基于 Debian Buster。没有mysql-client apt包,考虑https://packages.debian.org/search?keywords=mysql-client

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多