使用multi-stage构建docker镜像失败

uurity8g  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(431)

我正在尝试使用multi-stage构建docker镜像。
问题是,如果我使用相同的基础图像,会发生错误。
docker-compose.yml

version: "3"
services:
  dev_mac:
    build:
      context: .
      args:
        CLANG_URL: ${CLANG_URL}
        CMAKE_URL: ${CMAKE_URL}
        NODEJS_URL: ${NODEJS_URL}
        GIT_URL: ${GIT_URL}
        NVIM_URL: ${NVIM_URL}
        GCC_URL: ${GCC_URL}
    hostname: dev
    container_name: dev
    image: dev
    tty: true
    stdin_open: true
    ports:
      # used to access container via ssh
      - 20022:22

Dockerfile

FROM ubuntu:latest AS builder

ARG HOME=/root
ARG BIN_DIR=${HOME}/.bin

ARG NVIM_DIR=${BIN_DIR}/nvim
ARG GIT_DIR=${BIN_DIR}/git
ARG CMAKE_DIR=${BIN_DIR}/cmake
ARG GCC_DIR=${BIN_DIR}/gcc
ARG CLANG_DIR=${BIN_DIR}/clang
ARG NODEJS_DIR=${BIN_DIR}/nodejs

ARG CARGO=${HOME}/.cargo/bin/cargo

### Start from the home directdory ###
WORKDIR $HOME
### Make directories ###
RUN mkdir -p \
  ${NVIM_DIR} ${GIT_DIR} ${CMAKE_DIR} ${GCC_DIR} ${NODEJS_DIR} ${CLANG_DIR}

### install packages ###
RUN apt-get update && \
    apt-get -y install sudo \
                       curl \
                       wget \
                       cmake \
                       build-essential \
                       ninja-build \
                       dh-autoreconf \
                       libcurl4-gnutls-dev \
                       libexpat1-dev \
                       gettext \
                       libz-dev \
                       libssl-dev \
                       install-info \
                       libtool-bin \
                       pkg-config \
                       unzip \
                       git \
                       jq

### Install clang (Binary release) ###
ARG CLANG_URL
RUN wget -C ${CLANG_URL} -O clang_tar && \
    tar xvf clang_tar --strip 1 -C ${CLANG_DIR} && \
    cd $HOME && rm -rf clang_tar

### Install CMAKE (Binary release) ###
ARG CMAKE_URL
RUN wget -c ${CMAKE_URL} -O cmake_tar && \
    tar xvzf cmake_tar --strip 1 -C ${CMAKE_DIR} && \
    cd $HOME && rm -rf cmake_tar

### Install NODEJS (Binary release) ###
ARG NODEJS_URL
RUN wget -c ${NODEJS_URL} -O nodejs_tar && \
    tar xvf nodejs_tar --strip 1 -C ${NODEJS_DIR} && \
    cd $HOME && rm -rf nodejs_tar

### Install GIT (Compile) ###
ARG GIT_URL
RUN mkdir git_temp && \
    wget -c ${GIT_URL} -O git_tar && \
    tar -zxf git_tar --strip 1 -C git_temp && \
    cd git_temp && \
    make configure && \
    ./configure --prefix=${GIT_DIR} && \
    make -j all && make install && \
    cd $HOME && rm -rf git_tar git_temp

### Install NEOVIM latest (Compile) ###
ARG NVIM_URL
RUN git clone ${NVIM_URL} && \
    cd neovim && \
    make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=${NVIM_DIR} -DCMAKE_BUILD_TYPE=Release" -j && \
    make install && \
    cd $HOME && rm -rf neovim

### Install GCC (Compile) ###
ARG GCC_URL
#RUN mkdir gcc_temp && \
    #wget -c ${GCC_URL} -O gcc_tar && \
    #tar xzf gcc_tar --strip 1 -C gcc_temp && \
    #cd gcc_temp && \
    #./contrib/download_prerequisites && \
    #mkdir build && cd build && \
    #../configure --prefix=${GCC_DIR} \
                 #--enable-languages=c,c++ \
                 #--disable-multilib && \
    #make -j 8 && make install && \
    #cd $HOME && rm -rf gcc_tar gcc_temp

### Clear cache and change shell ###
RUN apt-get clean && \
    apt-get autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/cache/* && \
    rm -rf /var/lib/log/* && \

FROM ubuntu:latest
ARG HOME=/root
ARG BIN_DIR=/root/.bin

WORKDIR $HOME

COPY --from=builder ${BIN_DIR} ${HOME}

docker-compose --env-file .env.mac build dev_mac的输出是:

无法解决:rpc错误:code = Unknown desc = failed to solve with frontend dockerfile.v0:创建LLB定义失败:在阶段上检测到循环依赖关系:建筑商

我无法理解错误信息。
为什么我不能使用相同的基本映像?
据我所知,在FROM中描述的基本图像只是开始的基本图像。

lf5gs5x2

lf5gs5x21#

如果我尝试使用docker-compose build从您的Dockerfile构建一个映像,我会得到以下输出:

=> [internal] load build definition from Dockerfile                                                0.0s
 => => transferring dockerfile: 3.05kB                                                              0.0s
 => WARN: Empty continuation line found in: RUN apt-get clean &&     apt-get autoclean &&     apt-  0.0s
 => [internal] load .dockerignore                                                                   0.0s
 => => transferring context: 2B                                                                     0.0s
ERROR: failed to solve: circular dependency detected on stage: builder
ERROR: Service 'dev_mac' failed to build : Build failed

WARN:线很重要;如果我们查看您Dockerfile,我们会发现:

### Clear cache and change shell ###
RUN apt-get clean && \
    apt-get autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/cache/* && \
    rm -rf /var/lib/log/* && \     # <-- THIS LINE HERE

FROM ubuntu:latest

该行末尾没有继续的错误\导致下面的FROM ...行被忽略,因此Docker认为您的COPY --from=builder命令正在builder阶段内运行。
如果你修正了语法,一切都正常工作:

RUN apt-get clean && \
    apt-get autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/cache/* && \
    rm -rf /var/lib/log/*

FROM ubuntu:latest

但更好的解决方案是移除整个块。运行apt-get clean(etc)没有任何意义,因为您正在构建一个多级映像。只有最后阶段才重要;其它的都被丢弃。
在单阶段映像中,运行这样的apt-get clean只有在使用与apt-get install相同的RUN命令运行时才有用,等等;否则它实际上会增加你的图像的大小。

相关问题