![](/img/trans.png)
[英]“error readlink /var/lib/docker/overlay2 invalid argument” when I run docker-compose up
[英]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.