python - 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 f0df350
docker-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'
提前致谢
解决方案
运行容器时,和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
推荐阅读
- angular - 在没有角度的 service.ts 的两个模块中的两个组件之间传递数据
- reactjs - 如何在我的 React 应用程序中跟踪 Google Adwords 转化?
- javascript - 为什么映射过滤的对象数组不使用反应呈现?
- swift - 在 tableviewcell 中隐藏带有 UITextField 的返回键的键盘
- angular - Angular 的 ngOnInit 中未填充数据
- c# - 为什么前置摄像头的像素强度始终与 0.5f 相同(Frame.LightEstiamation.PixelIntesity)
- java - JUnit DisabledOnOs 注释不起作用
- java - JHipster 中外部 API 的访问控制策略
- java - 如何检测用户是否拖动 PIP 窗口(向下拖动以关闭)?
- android - 我如何使所有应用程序从右到左接收一个部分?以及使这部分没有显示在 rtl 语言上的问题是什么?