【问题标题】:Dockerfile ENV lost in container when deployed to Kubernetes部署到 Kubernetes 时 Dockerfile ENV 在容器中丢失
【发布时间】:2023-02-01 04:59:05
【问题描述】:

多年来,我们在本地构建了基本的 PHP-FPM 容器镜像,使用如下代码来包括 Oracle DB 支持:

ARG PHP_VERSION=7.4
ARG PHP_TYPE=fpm

FROM php:${PHP_VERSION}-${PHP_TYPE}

ENV LD_LIBRARY_PATH /usr/local/instantclient
ENV ORACLE_BASE     /usr/local/instantclient
ENV ORACLE_HOME     /usr/local/instantclient
ENV TNS_ADMIN       /etc/oracle

COPY oracle /etc/oracle

RUN echo 'instantclient,/usr/local/instantclient' | pecl install oci8-${OCI8_VERSION} \
    && docker-php-ext-configure oci8 --with-oci8=instantclient,/usr/local/instantclient \
    && docker-php-ext-install oci8 \
    && docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/usr/local/instantclient \
    && docker-php-ext-install pdo_oci \
    && rm -rf /tmp/pear

从这个图像我们构建部署到 Kubernetes 集群的应用程序特定图像并且 TNS_ADMIN 变量和值一直存在而没有问题。

我们最近更改了图像的构建方式(使用 Kaniko 和 GitLab CI 而不是在本地构建它们)并发现现在当图像部署到 Kubernetes 集群时(通过 Helm)TNS_ADMIN 变量现在丢失了(不仅仅是空白值,整个变量)。另一个改变是 Oracle 片段的安装方式(使用docker-php-extension-installer),所以相关的 Dockerfile 代码现在看起来像这样:

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions oci8 pdo_oci

# Oracle client config
ENV TNS_ADMIN=/etc/oracle
COPY php.cli/oracle /etc/oracle

并且,这里是 GitLab CI Kaniko 相关代码,用于构建特定于应用程序的图像(只有 $PHP_TYPE 适用于相关图像):

- |
      LOCAL_REPOSITORY=${CI_REGISTRY}/<internal namespace path>/$REPOSITORY
      # Build config.json for credentials
      echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
      /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/$DOCKER_FILE_PATH/Dockerfile --build-arg PHP_VERSION=$PHP_VERSION --build-arg PHP_TYPE=$PHP_TYPE --build-arg PHPUNIT_VERSION=$PHPUNIT_VERSION --build-arg PHPCS_VERSION=$PHPCS_VERSION --build-arg PHPCSFIXER_VERSION=$PHPCSFIXER_VERSION --destination $LOCAL_REPOSITORY:$PHP_VERSION-$TAG_NAME

我们认为这可能是由于 Kaniko 的工作方式或 Oracle 安装过程的更改所致,因此我们分别提取了基础映像和应用程序映像,并使用 bash shell 运行它们。在本地拉取时,TNS_ADMIN 变量存在。这表明一旦 Helm 将其部署到集群,就会发生任何事情。

令人烦恼的是,从表面上看,我们所做的任何更改都不应该影响图像中以这种方式设置的环境变量,但这些是与出现的问题相吻合的唯一更改。因此,问题似乎出在将映像部署到我们的集群时。这个过程本身并没有发生任何变化. Helm 图表没有变化,这表明它不是这个问题的一部分;也就是说,当 Helm 部署使用该图像的图表时会出现问题。

有没有其他人看到过这样的事情,或者有任何想法将我们的搜索集中在哪里?

【问题讨论】:

  • 我认为这里没有足够的具体信息来回答这个问题。您可以更新问题以包含 minimal reproducible example 吗?这将包括一个最小的 Dockerfile,您运行 Kaniko 的确切方式,以及实际从您的图像运行容器的部署清单。
  • 我将更新消息以充实一些细节。

标签: kubernetes dockerfile gitlab-ci kubernetes-helm


【解决方案1】:

好吧,我们的问题可能是许多在 Kubernetes 中运行应用程序的人普遍存在的问题:我们的 Helm 部署的图像拉取策略设置为 IfNotPresent 并且正在使用未设置 ENV 值的缓存图像(该图像是使用构建的一个没有设置 TNS_ADMIN 的 Dockerfile。我们的流程中有很多活动部件,因此进行了多项未看到的更改。

我当然对这种解释感到吃惊,所以我会提供建议,以确保您始终确保拉取新图像,作为解决 Kubernetes/Helm 部署问题的第一步。

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2021-09-13
    • 2021-07-05
    • 2022-12-17
    • 1970-01-01
    • 2018-09-05
    • 2022-08-22
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多