【发布时间】: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