我正在尝试使用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
中描述的基本图像只是开始的基本图像。
1条答案
按热度按时间lf5gs5x21#
如果我尝试使用
docker-compose build
从您的Dockerfile
构建一个映像,我会得到以下输出:WARN:
线很重要;如果我们查看您Dockerfile
,我们会发现:该行末尾没有继续的错误
\
导致下面的FROM ...
行被忽略,因此Docker认为您的COPY --from=builder
命令正在builder
阶段内运行。如果你修正了语法,一切都正常工作:
但更好的解决方案是移除整个块。运行
apt-get clean
(etc)没有任何意义,因为您正在构建一个多级映像。只有最后阶段才重要;其它的都被丢弃。在单阶段映像中,运行这样的
apt-get clean
只有在使用与apt-get install
相同的RUN
命令运行时才有用,等等;否则它实际上会增加你的图像的大小。