Docker镜像无法在Live上构建,但可以在Dev上正常运行

And*_*dre 4 mysql docker dockerfile

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
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在我的开发机器上,此Dockerfile构建得非常好,但是在我们的活动服务器上,它突然出现了故障(过去工作过)E: Package 'mysql-client' has no installation candidate

我认为Docker的要点是,所有内容都使用相同的映像运行,并且您不应遇到此类问题。

为什么会这样,我该怎么做才能从这里修复它,以使其在开发人员和现场都能正常运行?

Pie*_* B. 5

您正在使用的图像python与标签2.7,然而这个标签是“共享”标签按上泊坞枢纽Python的自述正在改变其他时间:现在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--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
Run Code Online (Sandbox Code Playgroud)

精确地:

我认为Docker的要点是,所有内容都使用相同的映像运行,并且您不应遇到此类问题。

为什么会这样,我该怎么做才能从这里修复它,以使其在开发人员和现场都能正常运行?

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