You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD在AWS Fargate上使用Kaniko持续故障求助

问题所在

我在使用Kaniko在AWS Fargate上构建Docker镜像时,GitLab CI流水线出现异常。流水线可在Fargate上启动任务,但不同Dockerfile会触发各类错误,如过多syslink调用、特定apt-get命令执行失败。我需要协助解决自定义Kaniko镜像的这些问题。

采用该架构是为了避免使用DinD(Docker in Docker),降低AWS Fargate的成本。我已通过所有Dockerfile测试了DinD方案,且运行正常。

根据GitLab官方文档,我使用以下Dockerfile构建AWS Fargate任务定义所需的镜像:

FROM --platform=linux/amd64 gcr.io/kaniko-project/executor AS kaniko

FROM --platform=linux/amd64 ubuntu:20.04

# ----------------------------------------------------------------
# Copy the kaniko executable and cloud container registry helpers.
# Then, set up the tool.
# ----------------------------------------------------------------
COPY --from=kaniko /kaniko/executor /kaniko/
COPY --from=kaniko /kaniko/docker-credential-gcr /kaniko/
COPY --from=kaniko /kaniko/docker-credential-ecr-login /kaniko/

ENV DOCKER_CONFIG /kaniko/.docker/
ENV DOCKER_CREDENTIAL_GCR_CONFIG /kaniko/.config/gcloud/docker_credential_gcr_config.json
ENV PATH ${PATH}:/kaniko

RUN mkdir -p /kaniko/.docker \
    && mkdir -p /kaniko/ssl \
    && docker-credential-gcr config --token-source=env

# ---------------------------------------------------------------------
# Install tini - a very small 'init' process that helps processing signals sent to the container properly.
# ---------------------------------------------------------------------
ARG TINI_VERSION=v0.19.0

RUN apt-get update \
    && apt-get install -y curl \
    && curl -Lo /usr/local/bin/tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64 \
    && chmod +x /usr/local/bin/tini

# --------------------------------------------------------------------------
# Install and configure sshd.
# --------------------------------------------------------------------------
RUN apt-get install -y openssh-server \
    && mkdir -p /var/run/sshd

EXPOSE 22

# ----------------------------------------
# Install GitLab CI required dependencies.
# ----------------------------------------
ARG GITLAB_RUNNER_VERSION=v13.6.0

RUN curl -Lo /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/${GITLAB_RUNNER_VERSION}/binaries/gitlab-runner-linux-amd64 \
    && chmod +x /usr/local/bin/gitlab-runner \
    && gitlab-runner --version

RUN apt-get install -y git-lfs \
    && git lfs install --skip-repo

# ------------------------------------------------------------------------------------
# Execute a startup script.
# ------------------------------------------------------------------------------------
COPY test.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/test.sh
ENTRYPOINT ["tini", "--", "/usr/local/bin/test.sh"]

对应的test.sh文件内容如下:

#!/bin/sh

if command -v tini >/dev/null 2>&1; then
  echo "tini is installed."
else
  echo "tini is not installed."
fi

# Create a folder to store user's SSH keys if it does not exist.
USER_SSH_KEYS_FOLDER=~/.ssh
[ ! -d ${USER_SSH_KEYS_FOLDER} ] && mkdir -p ${USER_SSH_KEYS_FOLDER}

# Copy contents from the `SSH_PUBLIC_KEY` environment variable
# to the `$USER_SSH_KEYS_FOLDER/authorized_keys` file.
# The environment variable must be set when the container starts.
echo ${SSH_PUBLIC_KEY} > ${USER_SSH_KEYS_FOLDER}/authorized_keys

# Clear the `SSH_PUBLIC_KEY` environment variable.
unset SSH_PUBLIC_KEY

# Start the SSH daemon
exec /usr/sbin/sshd -D

该方案存在诸多问题,我发现官方Kaniko Dockerfile使用FROM Scratch,导致我无法按照文档步骤配置镜像。

预期行为:
GitLab CI流水线应通过Kaniko在AWS Fargate上构建Docker镜像,并将镜像推送到指定镜像仓库。


解决方案建议

1. 调整镜像基础,避免环境冲突

官方Kaniko镜像基于Scratch/Alpine,仅保留核心运行组件,你用Ubuntu作为基础镜像会引入大量冗余系统库,容易和Kaniko运行时产生冲突,引发syslink调用异常、命令执行失败等问题。建议改用Kaniko的Alpine版本作为基础镜像,在此之上添加所需组件:

# 选用Kaniko的Alpine版本,方便安装依赖且环境更简洁
FROM gcr.io/kaniko-project/executor:alpine

# 安装openssh-server、curl、git-lfs等依赖
RUN apk add --no-cache openssh-server curl git-lfs

# 配置SSHD允许root登录(适配GitLab Runner场景)
RUN mkdir -p /var/run/sshd \
    && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

# 升级GitLab Runner到较新版本(避免旧版本兼容性问题)
ARG GITLAB_RUNNER_VERSION=v16.0.0
RUN curl -Lo /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/${GITLAB_RUNNER_VERSION}/binaries/gitlab-runner-linux-amd64 \
    && chmod +x /usr/local/bin/gitlab-runner

# 配置Git LFS
RUN git lfs install --skip-repo

# 安装tini
ARG TINI_VERSION=v0.19.0
RUN curl -Lo /usr/local/bin/tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64 \
    && chmod +x /usr/local/bin/tini

# 复制启动脚本
COPY test.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/test.sh

ENTRYPOINT ["tini", "--", "/usr/local/bin/test.sh"]

2. 修复Kaniko运行权限与环境变量

  • 确保Kaniko执行时拥有正确的权限,在GitLab CI配置中提前生成ECR登录配置:
    echo "{\"auths\":{\"$ECR_REGISTRY\":{\"auth\":\"$(echo -n "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" | base64)\"}}}" > /kaniko/.docker/config.json
    
  • 简化环境变量配置,确保Kaniko能正确识别路径:
    ENV DOCKER_CONFIG=/kaniko/.docker
    ENV PATH="$PATH:/kaniko"
    

3. 优化GitLab CI流水线配置

直接在流水线中调用Kaniko executor,无需通过SSHD间接执行,减少复杂度:

build:
  stage: build
  tags:
    - fargate
  script:
    # 生成ECR认证配置
    - echo "{\"auths\":{\"$ECR_REGISTRY\":{\"auth\":\"$(echo -n "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" | base64)\"}}}" > /kaniko/.docker/config.json
    # 执行Kaniko构建并推送镜像
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $ECR_REGISTRY/$CI_PROJECT_NAME:$CI_COMMIT_SHA

4. 排查apt-get失败问题

如果特定Dockerfile中的apt-get命令失败,可尝试:

  • 在目标Dockerfile中替换为AWS或国内镜像源,加速包下载
  • 检查Fargate任务的网络配置,确保允许访问外部HTTP/HTTPS地址

内容的提问来源于stack exchange,提问作者Aldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:42:01