【问题标题】:How to fix docker container exiting with code 6?如何修复使用代码 6 退出的 docker 容器?
【发布时间】:2021-09-06 20:05:40
【问题描述】:

上下文

我正在我的个人计算机上运行一个带有 docker-compose 文件的 Meteor (js) 应用程序的 dockerized ubuntu。它附加到一个 mongo DB 容器。一个 nginx 代理容器正在运行,以使我的开发 url 使用 ssl (https) 保护。

Docker 镜像

  • ubuntu : ubuntu:18.04
  • nginx 代理:jwilder/nginx-proxy:alpine
  • mongo : mongo:latest
  • 加上我自己的本地流星应用程序。

其他

  • 流星版本:1.8.1
  • Docker 版本:18.09.3,构建 774a1f4
  • Docker Compose 版本:1.23.2,内部版本 1110ad01

问题

由于我使用 docker-compose down 停止了我的容器,当我重新启动它们时,我的 webapp 容器一直退出(退出代码为 6)。自从我之前的 docker-compose -f docker-compose.dev.yml --verbose up 以来,我没有更改 docker-compose 文件

docker-compose -f docker-compose.dev.yml --verbose up 显示的错误

compose.cli.verbose_proxy.proxy_callable: docker inspect_container <- ('26d90365fe9a4b0c0eb24cb2c040aa43cf8ec207764f350b6273ee7362d9fe0e')
compose.cli.verbose_proxy.proxy_callable: docker wait <- ('26d90365fe9a4b0c0eb24cb2c040aa43cf8ec207764f350b6273ee7362d9fe0e')
urllib3.connectionpool._make_request: http://localhost:None "GET /v1.25/containers/26d90365fe9a4b0c0eb24cb2c040aa43cf8ec207764f350b6273ee7362d9fe0e/json HTTP/1.1" 200 None
urllib3.connectionpool._make_request: http://localhost:None "POST /v1.25/containers/26d90365fe9a4b0c0eb24cb2c040aa43cf8ec207764f350b6273ee7362d9fe0e/wait HTTP/1.1" 200 30
compose.cli.verbose_proxy.proxy_callable: docker wait -> {'Error': None, 'StatusCode': 6}
compose.cli.verbose_proxy.proxy_callable: docker inspect_container -> {'AppArmorProfile': 'docker-default',
 'Args': [],
 'Config': {'ArgsEscaped': True,
            'AttachStderr': False,
            'AttachStdin': False,
            'AttachStdout': False,
            'Cmd': ['meteor'],
            'Domainname': '',
            'Entrypoint': None,
            'Env': ['ENV_APP_SERVER_USERNAME=app',
...webappContainer exited with code 6

docker ps -a 的结果

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                      PORTS                                      NAMES
26d90365fe9a        xxxxxxxxxx_webapp            "meteor"                 23 minutes ago      Exited (6) 13 seconds ago                                              webappContainer
4073bbfe37cf        mongo                        "docker-entrypoint.s…"   39 minutes ago      Up 14 seconds               0.0.0.0:27017->27017/tcp                   mongoDBContainer
201f0a99d1cf        jwilder/nginx-proxy:alpine   "/app/docker-entrypo…"   2 hours ago         Up 2 hours                  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-proxy_nginx-proxy_1

docker logs &lt;container_id&gt; 的结果

** 无 **

怎么样?容器甚至不会启动。当我执行 docker run 时,它可以工作..

源文件

  • docker-compose.dev.yml
version: '3'
services:
  webapp:
    container_name: webappContainer
    env_file: .env
    environment:
      VIRTUAL_HOST: mysite.local
      VIRTUAL_PORT: ${PORT}
    build:
      context: ${CONTEXT}
      dockerfile: ${DOCKERFILE}...
    volumes:
      - ${VOLUME}:/usr/src/app
    expose:
      - ${PORT}
    networks:
      - dbAppConnector
      - default
    depends_on:
    - mongodb
  mongodb:...
    container_name: ${MONGO_CONTAINER_NAME}
    image: mongo
    restartmongodb: always
    env_file: .env
    ports:
    - "${MONGO_PORT}:${MONGO_PORT}"..
    networks:
      dbAppConnector:
    volumes:
    - mongo_volume:/data/db
    - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
volumes:
  mongo_volume:
networks:
  default:
    external:
      name: nginx-proxy
  dbAppConnector:


请注意,当我执行docker-compose config 时,每个 .env 变量都会正确显示。

  • Dockerfile.dev
FROM ubuntu:18.04

# Set environment dir & copy files
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

# Make host.docker.internal accessible from outside the container (dev only)
# RUN ip -4 route list match 0/0 | awk '{print $3 "host.docker.internal"}' >> /etc/hosts

# Add user to run localy (dev only) the app
RUN addgroup meteoruser &&  useradd -rm -d /home/moff -s /bin/bash -g root -G sudo -u 1000 meteoruser

# Update distribution
RUN apt-get update -q && apt-get clean \
  # Install curl
  && apt-get install curl -y \
  # Install Meteor
  && (curl https://install.meteor.com | sh) \
  # Install node js
  && cd /usr/src/app \
  # replace vx.x.x by meteor node -e 'console.log("I am Node.js %s!", process.version);' output from my project folder.
  && bash -c 'curl "https://nodejs.org/dist/v8.15.1/node-v8.15.1-linux-x64.tar.gz" > /usr/src/app/required-node-linux-x64.tar.gz' \
  && cd /usr/local && tar --strip-components 1 -xzf /usr/src/app/required-node-linux-x64.tar.gz \
  && rm /usr/src/app/required-node-linux-x64.tar.gz \
  && cd /usr/src/app \
  && npm install

RUN cd /usr/src/app && chown -Rh meteoruser .meteor/local
EXPOSE 80
ENV PORT 80
WORKDIR /usr/src/app

USER meteoruser
CMD ["meteor"]

我目前尝试解决的问题

  • 我停止并删除了所有容器,删除了所有映像,删除了所有网络,并重建了所有内容。
  • 我检查了我的互联网访问(平均 ping:~35 毫秒)。
  • 我尝试了不同版本的“Meteor js”(1.8.1、最新、1.8.0.2),在 Dockerfile.dev 部分使用 &amp;&amp; (curl https://install.meteor.com | sh) \ 标记 ?release=1.8.0.2
  • 当容器退出时,我尝试查找有关代码 6 的一些文档,但没有发现任何相关内容。
  • 它试图查看日志,但对于退出的应用程序容器 xxxxxx_webapp 没有可用的日志:结果为空。
  • 我尝试单独启动 xxxxxx_webapp 容器,结果很奇怪,docker run xxxxxxx_webapp
This is your first time using Meteor!
Installing a Meteor distribution in your home directory.
Downloading Meteor distribution

花了 2 多分钟才终于显示出来:

Retrying download in 5 seconds …
Retrying download in 5 seconds …
Retrying download in 5 seconds …
Retrying download in 5 seconds …

[[[[[ /usr/src/app ]]]]]

=> Started proxy.
=> Started MongoDB.

因此容器正在运行而无需使用单独的docker run 命令退出......

提醒:4 周多以来一切正常,然后我突然怀疑我的新互联网连接速度太慢(我 1 周前从父母家搬到了这里)。

大家能给点建议吗?我可以提供任何其他信息来帮助您了解我所缺少的吗?提前致谢!

编辑

其他尝试使事情发挥作用:

  • 我从 docker 中删除并重新安装了所有内容。
  • 我在 3 周前试用了该应用的旧版本,该版本可以正常运行。
  • 我尝试了所有方法,除了使用另一个 wi-fi。这行得通吗?我不这么认为,但总有希望。

【问题讨论】:

  • 你能把你的代码删减一些吗?如果网络设置等细节对问题没有任何影响,请删除它们。
  • 您还使用 Docker 绑定挂载来替换映像中的应用程序代码。这不是你在生产设置中做过的事情(图像应该是独立的),我建议在开发设置中也尽量避免它;在有意义时使用本机主机工具。 ${VOLUME} 目录的内容可能对于重现这一点至关重要。
  • @DavidMaze 绑定挂载仅用于开发目的,以便我可以在浏览器中享受热代码重载,但当然,在生产中它是自容器映像!好的,我会削减它谢谢你的回复:)
  • 由于您正在安装源代码,并且容器正在使用“meteor”命令运行,您是否在两次运行之间更改了任何源代码文件?我们可以看到完整的撰写文件吗?
  • @DaveS 我编辑了 docker-compose 文件内容。我想我会尝试获取该应用程序的先前版本并运行它以查看是否仍然存在该问题。我会告诉你它是否有效:)

标签: docker meteor docker-compose


【解决方案1】:

虽然我也从未发现退出代码 6 是什么,但我确实在我的设置中找到了它的原因。 原来我的环境是无效的,因为我不小心将它设置为一个不存在的分支。

docker-compose --verbose up 让我走上正确的道路

【讨论】:

  • 感谢您的贡献,知道总是很高兴。我希望 Docker 人员能够围绕这些退出代码创建更详尽的文档。
【解决方案2】:

TL;DR:如果您的用例涉及作为卷一部分的已删除目录,请删除 docker 卷,重新启动 docker,然后再次运行 compose up


我遇到了同样的问题,而且似乎与我的一本书有关。

我的docker-compose 文件中有以下定义:

  volumename:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: "${PWD}/data/some/dir"

我已经删除并重新创建了"${PWD}/data/some/dir" 目录,然后开始为依赖于卷的容器获取exit code 6

我尝试过的事情:

  • 重启泊坞窗
  • 删除卷(使用 Docker 桌面 UI)- 这似乎可以解决问题

【讨论】:

    【解决方案3】:

    当您指向错误的分支时,会抛出退出代码 6。检查您是否指向有效分支:docker-compose --verbose 应该可以解决您的问题。

    另外,我建议您检查一次代码中的音量部分。

    【讨论】:

      【解决方案4】:

      解决方案

      我像这样从我的计算机上的 docker 卸载了 e-v-e-r-y-t-h-i-n-g:

      警告:请注意,使用此过程您将丢失配置、图像和容器。

      • 首先我从“系统”中删除了未使用的数据:
      sudo docker system prune
      
      • 然后,删除所有网络和卷:
      sudo docker volume prune
      sudo docker network prune
      
      • 然后,需要完全卸载 docker:
      apt-get remove --purge docker*
      
      • 然后我不得不删除 docker 容器和图像:
      rm -rf /var/lib/docker
      
      • 然后,删除配置文件,..
      rm -rf /etc/docker
      rm /etc/systemd/system/docker.service
      rm /etc/init/d/docker
      
      • 然后删除过时和孤立包:
      apt-get autoremove && apt-get autoclean
      
      • 然后更新和升级现有软件包
      apt-get update && apt-get upgrade
      

      终于重新安装了 docker 和 docker-compose from :

      然后我从 git 重新下载了我的项目,并使用 docker-compose up -d 重新安装了它:)

      所以,我认为这是 docker 的配置问题。不幸的是,我从未找到关于“退出代码 6”的明确答案..

      如果您遇到同样的“退出代码 6”问题,请随时分享您的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 2017-04-07
        • 2020-07-08
        • 2018-10-08
        • 2019-04-07
        • 2020-09-22
        相关资源
        最近更新 更多