首页 > 解决方案 > Docker-Compose + 命令

问题描述

看来我的 docker-compose 命令只执行最后一个命令。在这种情况下运行服务器。

command: python3 manage.py collectstatic --noinput
command: python3 manage.py migrate --noinput
command: python3 manage.py runserver 0.0.0.0:8000

我试图将这些命令移动到 entrypoint.sh 文件中。但是,我不知道如何在我的 dockerfile 和 docker-compose 中实现它。

以下是我的dockerfile:

# Pull base image
FROM python:3

# Set environment varibles
ENV PYTHONUNBUFFERED 1

# Set work directory
RUN mkdir /code
WORKDIR /code

# Install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./Pipfile /code/Pipfile
RUN pipenv install --deploy --system --skip-lock --dev

# Copy project
COPY . /code/

我的码头工人撰写:

version: '3'

services:
  db:
    image: postgres
    ports:
      - "5432:5432"
  web:
    build: .
    command: python3 manage.py collectstatic --noinput
    command: python3 manage.py migrate --noinput
    command: python3 manage.py runserver 0.0.0.0:8000
    env_file: .env
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

入口点.sh

#!/bin/bash

# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput

# Apply database migrations
echo "Apply database migrations"
python manage.py migrate

# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000

标签: docker

解决方案


那是因为你只能拥有一个command

您可以像这样组合多个命令:

command: sh -c "python3 manage.py collectstatic --noinput && python3 manage.py migrate --noinput && python3 manage.py runserver 0.0.0.0:8000"

或者,正如您提到的入口点,您可以在Dockerfiledocker-compose.yml中指定入口点。确保删除这些命令,因为您不再需要它们。

这是一篇关于入口点 vs cmd vs 运行的好文章:http: //goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/


推荐阅读