使用docker-compose up命令出现错误:处理tar文件时出错(archive/tar: invalid tar header)。

3

我不能运行docker-compose updocker-compose build --no-cache。两者都以ERROR: Error processing tar file(archive/tar: invalid tar header)退出。

我之前运行了以下命令导致了这种情况:

要停止并删除容器:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

删除所有图像:

docker rmi $(docker images -q)

我已经尝试过以下方法:
  • docker-compose ps 不列出任何容器或镜像。

  • docker ps -a 也没有列出任何容器。

  • docker image list 没有列出任何镜像。

我正在以调试模式运行 dockerd,并看到:

DEBU[0998] Calling GET /v1.22/images/codesource_buildbot/json 
ERRO[0998] Handler for GET /v1.22/images/codesource_buildbot/json returned error: No such image: codesource_buildbot

看起来我已经把docker弄到了一个奇怪的状态,而且无法恢复到正常状态。

我尝试过运行docker-compose down但是没有任何帮助。

Docker版本:

Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64
 Experimental: false

docker-compose版本:docker-compose版本1.12.0,构建b31ff33

docker-compose.yml文件

version: '2'
services:
  buildbot:
    build: ./containers/buildbot
    ports: 
      - "8010:8010"
    volumes:
      - "./containers/buildbot/volume:/code"

Dockerfile

FROM debian:latest
WORKDIR /home
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "python-dev"]
RUN ["apt-get", "install", "-y", "python-pip"]
RUN ["apt-get", "install", "-y", "git-all"]
RUN ["pip", "install", "--upgrade", "pip"]
RUN ["pip", "install", "--ignore-installed", "six"]
RUN ["pip", "install", "service_identity"]
RUN ["pip", "install", "buildbot[bundle]"]
CMD bash wait_for_master.sh

请包括 docker version 的完整输出。您的构建目录有多大(目录及其子目录中所有文件的大小)? - BMitch
@BMitch 我已经更新了 Docker 版本,并在上面提供了完整的信息。我正在工作的目录的完整大小为 472K。 - Hudson Worden
我已经没有更多的想法了,但你可能需要包含你正在尝试构建的 Dockerfile 和能够重现此问题的 docker-compose.yml 文件。 - BMitch
2个回答

2
错误信息显示codesource_buildbot镜像不存在。你需要重新构建它或在你的docker-compose.yml中添加一个适当的build指令。
编辑:
PD:你的Dockerfile有点复杂。你可以使用以下命令: FROM debian:latest WORKDIR /home RUN apt-get update && \ apt-get install -y python-dev \ python-pip \ git-all && \ pip install --upgrade pip --no-cache-dir && \ pip install --ignore-installed six --no-cache-dir && \ pip install service_identity --no-cache-dir && \ pip install buildbot[bundle] --no-cache-dir CMD bash wait_for_master.sh 我会在pip命令中添加--no-cache-dir,这样Zip文件就不会被缓存,镜像也会更小。

`docker-compose.ymlcontainers: buildbot tools: delete-all-containers.sh delete-all-image` - Hudson Worden
我在docker-compose中没有看到--build作为有效选项。只有Docker Compose 1.10.1和1.13.0中的build命令。 - Ricardo Branco
我会试试看的。docker-compose up 命令有一个有效的 --build 选项。参考 https://docs.docker.com/compose/reference/up/。我正在使用 docker-compose 1.12.0 版本。 - Hudson Worden
2
啊啊啊我想我知道了。ls -l显示容器在共享卷中创建的一个文件夹是由root用户和root组拥有的。我使用chown和chgrp更改了用户和组,然后docker-compose up --build开始工作了。所以我认为我需要做的是让那个文件夹在容器的其他地方创建,而不是在共享卷中创建。 - Hudson Worden
1
感谢您的帮助! - Hudson Worden
显示剩余8条评论

0

关于我在同样的问题上遇到的经验,我只是删除了我挂载为卷的所有文件夹。这发生在运行Ubuntu GNU/Linux的计算机上。

例如,如果我有以下来自个人项目的docker-compose.yml

version: '2'
services:

 phpBB_dev:
  build:
    context: .
    dockerfile: Dockerfile
    args:
      XDEBUG_HOST: 172.17.0.1
      XDEBUG_PORT: 9021
      UID: 1000
      GID: 1000
  image: 'pcmagas/phpbb_dev'
  links:
    - mariadb
    - postgresql
  volumes:
    - "$SRC_PATH:/var/www/html:Z"
    - "$SRC_PATH_3_1_10:/var/www/phpBB_3_1_10:Z"
    - "$SRC_PATH_3_0_14:/var/www/phpBB_3_0_14:Z"

 nginx:
  image: nginx
  ports:
    - "5092:5092"
    - "5093:5093"
    - "5094:5094"
  links:
    - "phpBB_dev"
  volumes:
    - './nginx.conf:/etc/nginx/nginx.conf:ro'
    - './logs/dev/nginx:/var/logs'
  volumes_from:
    - 'phpBB_dev'

 mariadb:
  image: mariadb
  volumes:
    - './db/maria:/var/lib/mysql'
  ports:
    - '5434:5432'
  environment:
    MYSQL_RANDOM_ROOT_PASSWORD: "yes"
    MYSQL_ONETIME_PASSWORD: "yes"
    MYSQL_DATABASE: 'phpBB'
    MYSQL_USER: 'phpbb'
    MYSQL_PASSWORD: 'a_dummy_passwd'

 postgresql:
  image: postgres
  volumes:
    - './db/postgresql:/var/lib/postgresql/data'
  ports:
    - '3306:3306'
  environment:
    POSTGRES_DB: 'phpbb'
    POSTGRES_USER: 'phpbb'
    POSTGRES_PASSWORD: 'a_dummy_passwd'

我会删除文件夹./db,其中mariadb和postgresql存储数据。同时,我也会删除./logs,其中nginx保存其日志。

对于GNU/Linux或类似系统,一个好的经验法则是遵循以下步骤:

第一步:

使用ls -l命令列出所有作为VOLUME挂载的文件和文件夹,并具有root所有者和组。

第二步:

然后使用rm -rf command将它们删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接