首页 > 解决方案 > Docker Ubuntu:20.04 上的未知命令 bash 或 /bin/bash 与 docker-compose 版本 3.5

问题描述

我正在使用 Django 应用程序设置 docker,但该bash命令不适用于 dockerUbuntu:20.04和 docker-compose version 3.5

我的 docker 版本是Docker version 20.10.7, build f0df350docker-compose 版本是Docker Compose version 2.0.0-beta.4

谁能帮我解决这个问题?

以下是我的码头文件:

Dockerfile:

FROM ubuntu:20.04

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update
RUN apt-get install -y --no-install-recommends default-libmysqlclient-dev
RUN apt-get install -y gcc git libc-dev python3-dev python3-pip
RUN ln -s /usr/bin/python3 /usr/bin/python

RUN mkdir /app
WORKDIR /app
ADD . /app

RUN pip install --upgrade pip && pip install -r requirements.txt

EXPOSE 8000

ENTRYPOINT [ "/app/manage.py" ]

码头工人-compose.yml

version: '3.5'
services:
  db:
    image: mysql:5.6
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: "mydb"
      MYSQL_ROOT_PASSWORD: "root"
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always
    networks:
      default:
        aliases:
          - app-db

  
  django:
    build: .
    command: bash -c "while true; do runserver 0.0.0.0:8000; sleep 10; done"
    stdin_open: true
    tty: true
    volumes:
      - .:/app
    depends_on:
      - db
    ports:
      - "8000:8000"
    restart: always
    environment:
      MYSQL_DATABASE: "mydb"
      MYSQL_USER: "root"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_HOST: "app-db"

volumes:
    mysql_data: {}

我在运行时收到命令错误docker-compose up --build

bash -c "while true; do runserver 0.0.0.0:8000; sleep 10; done"

错误:未知命令:'bash'

提前致谢

标签: pythondjangobashdockerdocker-compose

解决方案


运行容器时,ENTRYPOINT组合CMD一个命令;如果命令部分被 Docker Compose 覆盖并不重要,容器仍然以这种方式只运行一个命令。所以实际上你要求主容器进程是

/app/manage.py bash -c "while true; do runserver 0.0.0.0:8000; sleep 10; done"

抱怨是 Django 跑步者不理解manage.py bash为子命令。

在您的 Dockerfile 本身中,您可能希望默认命令是启动服务器。拥有ENTRYPOINT任意的“一半命令”往往会更令人困惑,并导致也需要覆盖它;将其作为标准容器可能会更好CMD

# No ENTRYPOINT, but
CMD ["/app/manage.py", "runserver", "0.0.0.0:8000"]

您不需要将重启循环放入容器命令中,因为 Docker 已经允许您为容器指定重启策略。您应该能够将该docker-compose.yml部分修剪为:

django:
  build: .
  # command: is built into the image
  # don't usually need stdin_open: or tty:
  # don't overwrite the image code with volumes:
  depends_on:
    - db
  ports:
    - "8000:8000"
  restart: always  # replaces the "while true ... done" shell loop
  environment: *as-in-the-question

推荐阅读