docker-compose:超过最大深度

hel*_*osk 2 docker docker-compose

我正在使用 docker-compose,但是当我再次尝试构建它时,显示此错误,我多次构建了这个 docker-compose:

ERROR: Service 'api' failed to build: max depth exceeded
Run Code Online (Sandbox Code Playgroud)

我尝试执行 docker system prune 来清理我的容器,但没有用。

docker-compose.yml

version: "3"
services:
    client:
        container_name: my_client
        image: mhart/alpine-node:12
        build: ./client      
        restart: always
        ports:
            - "3000:3000"
        working_dir: /client
        volumes:
            - ./client:/client
        entrypoint: ["npm", "start"]
        links:
            - api
        networks: 
            - my_network
    api:
        container_name: my_api
        build: ./api
        restart: always
        ports:
            - "9000:9000"
        environment:
            DB_HOSTNAME: mysql    
        working_dir: /api
        volumes:
            - ./api:/api
        depends_on: 
            - mysql
        networks:
            - my_network
    mysql:
        container_name: my_mysql
        build: ./db
        restart: always
        volumes:
            - /var/lib/mysql
            - ./db:/db
        ports:
            - "3307:3306"
        environment:
            - MYSQL_ROOT_PASSWORD=n 
            - MYSQL_USER=n
            - MYSQL_PASSWORD=n
            - MYSQL_DATABASE=n
        networks: 
            - my_network
        command: '--default-authentication-plugin=mysql_native_password'
networks:
    my_network:
        driver: bridge
Run Code Online (Sandbox Code Playgroud)

这是 Dockerfile:

FROM mhart/alpine-node:12
WORKDIR /api
COPY package*.json /api/
RUN npm i -G nodemon
RUN npm install
COPY . /api/
EXPOSE 9000
CMD ["npm", "run", "dev"]
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

hel*_*osk 5

所以,我发现,我只需要执行docker system prune -a删除任何停止的容器。现在 --build 又开始工作了。

此命令删除了与我的 dockerfile 相关的所有本地 docker 图像。多次构建后,我的本地存储已达到有限,因此超出了错误最大深度。


Jed*_*edi 5

最大深度并不表示存储容量不足错误(尽管修剪可能会意外修复它)。

相反,它表明api您正在构建的图像具有太多层。

一个合理的理论是,您的撰写文件中包含此内容会导致递归:

        image: mhart/alpine-node:12
        build: ./client      
Run Code Online (Sandbox Code Playgroud)

这在 Dockerfile 中

FROM mhart/alpine-node:12
Run Code Online (Sandbox Code Playgroud)

(我假设 Dockerfile./client也是FROM同一个镜像)。

您的构建本质上是在mhart/alpine-node:12每次运行时在本地映像上添加几层(您可以通过运行来确认docker history mhart/alpine-node:12)。

如果是这样,您可能应该image在撰写文件中重命名。