我的 docker-compose 創建了 3 個容器——django、celery 和 rabbitmq。當我運行以下命令時 -> docker-compose build 和 docker-compose up,容器成功運行。
但是我在部署影像時遇到問題。生成的影像的影像 ID 為 24d7638e2aff。但是,無論出于何種原因,如果我只運行下面的命令,出口 0 不會發生任何事情。django 和 celery 應用程式都具有相同的影像 ID。
docker run 24d7638e2aff

這不好,因為我無法在 kubernetes 上部署此映像。我唯一的想法是 dockerfile 配置錯誤,但我無法弄清楚是什么原因
docker-compose.yaml
version: "3.9"
services:
django:
container_name: testapp_django
build:
context: .
args:
build_env: production
ports:
- "8000:8000"
command: >
sh -c "python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
links:
- rabbitmq
- celery
rabbitmq:
container_name: testapp_rabbitmq
restart: always
image: rabbitmq:3.10-management
ports:
- "5672:5672" # specifies port of queue
- "15672:15672" # specifies port of management plugin
celery:
container_name: testapp_celery
restart: always
build:
context: .
args:
build_env: production
command: celery -A testapp worker -l INFO -c 4
depends_on:
- rabbitmq
檔案
ARG PYTHON_VERSION=3.9-slim-buster
# define an alias for the specfic python version used in this file.
FROM python:${PYTHON_VERSION} as python
# Python build stage
FROM python as python-build-stage
ARG build_env
# Install apt packages
RUN apt-get update && apt-get install --no-install-recommends -y \
# dependencies for building Python packages
build-essential \
# psycopg2 dependencies
libpq-dev
# Requirements are installed here to ensure they will be cached.
COPY ./requirements .
# Create Python Dependency and Sub-Dependency Wheels.
RUN pip wheel --wheel-dir /usr/src/app/wheels \
-r ${build_env}.txt
# Python 'run' stage
FROM python as python-run-stage
ARG build_env
ARG APP_HOME=/app
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV BUILD_ENV ${build_env}
WORKDIR ${APP_HOME}
RUN addgroup --system appuser \
&& adduser --system --ingroup appuser appuser
# Install required system dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
# psycopg2 dependencies
libpq-dev \
# Translations dependencies
gettext \
# git for GitPython commands
git-all \
# cleaning up unused files
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& rm -rf /var/lib/apt/lists/*
# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
COPY --from=python-build-stage /usr/src/app/wheels /wheels/
# use wheels to install python dependencies
RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
&& rm -rf /wheels/
COPY --chown=appuser:appuser ./docker_scripts/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod x /entrypoint
# copy application code to WORKDIR
COPY --chown=appuser:appuser . ${APP_HOME}
# make appuser owner of the WORKDIR directory as well.
RUN chown appuser:appuser ${APP_HOME}
USER appuser
EXPOSE 8000
ENTRYPOINT ["/entrypoint"]
入口點
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
exec "$@"
我如何構建這些容器的鏡像以便我可以將它們部署到 k8s?
uj5u.com熱心網友回復:
Composecommand:覆寫 Dockerfile CMD。 docker run根本不查看docker-compose.yml檔案,并且docker run沒有特定的命令運行影像的CMD. 您還沒有為此宣告任何內容,這就是容器立即退出的原因。
保持入口點腳本不變(或者甚至完全洗掉它,因為它實際上并沒有做任何事情)。CMD在 Dockerfile 中添加一行
CMD python manage.py migrate && python manage.py runserver 0.0.0.0:8000
現在很明顯docker run,正如您所展示的,它將嘗試啟動 Django 服務器。對于 Celery 容器,您仍然可以傳遞命令覆寫
docker run -d --net ... your-image \
celery -A testapp worker -l INFO -c 4
如果你確實部署到 Kubernetes,并且你保留了入口點腳本,那么你需要args:在你的 pod 規范中使用來提供備用命令,而不是command:.
uj5u.com熱心網友回復:
我認為這是因為運行 django 服務器的命令在docker-compose.yml.
您應該將這些命令移到入口點內。
set -o errexit
set -o pipefail
set -o nounset
python manage.py migrate && python manage.py runserver 0.0.0.0:8000
exec "$@"
請注意,此命令python manage.py runserver 0.0.0.0:8000將使用不能用于生產目的的開發服務器啟動應用程式。
你應該尋找gunicorn或類似的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537960.html
標籤:姜戈码头工人库伯内特斯docker-compose芹菜
