簡體   English   中英

為什么我的docker鏡像在使用docker run(image)時沒有運行,但是docker-compose生成的容器卻可以跑起來?

[英]Why is my docker image not running when using docker run (image), but i can run containers generated by docker-compose up?

我的 docker-compose 創建了 3 個容器 - django、celery 和 rabbitmq。當我運行以下命令時 -> docker-compose build 和 docker-compose up,容器成功運行。

但是我在部署圖像時遇到問題。 生成的圖像的圖像 ID 為 24d7638e2aff。 但是,無論出於何種原因,如果我只運行下面的命令,出口 0 不會發生任何事情。django 和 celery 應用程序都具有相同的圖像 ID。

docker run 24d7638e2aff

這不好,因為我無法在 kube.netes 上部署此映像。 我唯一的想法是 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

Dockerfile

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?

Compose command:覆蓋 Dockerfile CMD docker run根本不查看docker-compose.yml文件,而docker run沒有特定命令運行圖像的CMD 您還沒有為此聲明任何內容,這就是容器立即退出的原因。

保持入口點腳本不變(或者甚至完全刪除它,因為它實際上並沒有做任何事情)。 在Dockerfile中增加一條CMD線路

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

如果您確實部署到 Kube.netes,並且保留了入口點腳本,那么您需要在 pod 規范中使用args:來提供備用命令,而不是command:

我認為這是因為運行 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或類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM