簡體   English   中英

使用 MinGW 編譯的 Qt5 構建 Docker 映像在從“docker:latest”映像運行的容器中工作,但在 GitLab CI 中失敗

[英]Building of a Docker image with Qt5 compiled with MinGW works in a container run from "docker:latest" image, but fails in GitLab CI

我想用 Qt5 和 MinGW 准備一個 docker 鏡像。 該過程的一部分是使用 MinGW 構建 Qt 5.14.0,這就是它失敗的部分。

在我的機器上構建。

當我在我的 PC 上拉取 docker:latest 圖像,從它運行容器並在這個容器中構建我的圖像時,沒有任何問題。 它工作得很好。

在 GitLab CI 管道中構建。

當我在 Gitlab 中推送 Dockerfile 時,它​​是從同一個 docker:latest 映像構建在容器中的,它無法構建 Qt,並顯示以下錯誤消息:

找不到 qmake 規范 ''。

處理項目文件時出錯:/root/src/qt-everywhere-src-5.14.0

失敗的截圖

CI腳本:

stages:
  - deploy

variables:
  CONTAINER_NAME: "qt5-mingw"
  PORT: "5000"

image: docker:latest

build-snapshot:
  stage: deploy
  tags:
    - docker
    - colo
  environment:
    name: snapshot
    url: https://somedomain.com/artifactory/#/artifacts/qt5-mingw
  before_script:
    - docker login -u ${ARTIFACT_USER} -p ${ARTIFACT_PASS} somedomain.com:${PORT}
  script:
    - docker build -f Dockerfile -t ${CONTAINER_NAME} .
    - export target_version=$(docker inspect --format='{{index .Config.Labels "com.domain.version" }}' ${CONTAINER_NAME})
    - docker tag ${CONTAINER_NAME} dsl.domain.com:${PORT}/${CONTAINER_NAME}:${target_version}
    - docker tag dsl.domain.com:${PORT}/${CONTAINER_NAME}:${target_version} dsl.domain.com:${PORT}/${CONTAINER_NAME}:latest
    - docker push dsl.domain.com:${PORT}/${CONTAINER_NAME}:${target_version}
    - docker push dsl.domain.com:${PORT}/${CONTAINER_NAME}:latest
  after_script:
    - docker logout dsl.domain.com:${PORT}
    - docker rmi ${CONTAINER_NAME}
  except:
    - master
    - tags

Dockerfile:

FROM debian:buster-slim

########################
# Install what we need
########################

# Custom Directory
ENV CUSTOM_DIRECTORY YES
ENV WDEVBUILD /temp/build
ENV WDEVSOURCE /temp/src
ENV WDEVPREFIX /opt/windev

# Custom Version
ENV CUSTOM_VERSION NO
ENV QT_SERIES 5.14
ENV QT_BUILD 0
ENV LIBJPEGTURBO_VERSION 2.0.3
ENV LIBRESSL_VERSION 3.0.2
ENV OPENSSL_VERSION 1.1.1c
ENV UPX_VERSION 3.95

# SSL Choice
ENV USE_OPENSSL YES

# Exclude Static Qt
ENV BUILD_QT32_STATIC NO
ENV BUILD_QT64_STATIC NO

# Copy directory with qt_build script
COPY rootfs /

# install tools
RUN apt-get update \
  && apt-get install -y bash \
        cmake \
        coreutils \
        g++ \
        git \
        gzip \
        libucl1 \
        libucl-dev \
        make \
        nasm \
        ninja-build \
        perl \
        python \
        qtchooser \
        tar \
        wget \
        xz-utils \
        zlib1g \
        zlib1g-dev \
  && apt-get install -y binutils-mingw-w64-x86-64 \
        mingw-w64-x86-64-dev \
        g++-mingw-w64-x86-64 \
        gcc-mingw-w64-x86-64 \
        binutils-mingw-w64-i686 \
        mingw-w64-i686-dev \
        g++-mingw-w64-i686 \
        gcc-mingw-w64-i686 \
  && rm -rf /temp \
    && rm -rf /var/lib/apt/lists/*

# Build Qt with mingw and the step where it fails.
RUN /opt/windev/bin/qt_build \



LABEL com.domain.version="1.0.0"
LABEL vendor="Someone"
LABEL com.domain.release-date="2020-01-21"

到目前為止的調試過程:

  • docker:latest 的版本在這兩種情況下是相同的。
  • 在這兩種情況下,MinGW 的版本是相同的。
  • 我也嘗試過 Qt 5.12.6,結果是一樣的。

我已經找到了。 我想答案就在這里

軟件包libseccomp2在 CI Runner 機器上是 2.3.1,在我的 PC 上是 2.4.1。 但是 5.10 之后的 Qt 版本使用的是 2.3.3 中添加的系統調用,所以這就是為什么它可以在我的 PC 上構建而不能在 runner 上構建的原因。

Reamrak:它是在從docker:latest鏡像運行的容器中構建的沒有關系,因為Docker Daemon是在容器啟動時掛載的,所以顯然它繼續使用主機的一些功能,docker工作並不完全集裝箱化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM