Как я могу запустить контейнер Docker на удаленном сервере так же, как docker -compose up? - PullRequest
2 голосов
/ 01 августа 2020

TL; DR: Ошибка получения /docker-entrypoint.sh: line 10: exec: nginx: cannot execute: Is a directory выполняется docker run username/srdc_prod:2020.07.26, когда docker-compose up работает нормально.

У меня есть контейнер docker, который я отправил в DockerHub. Я могу запустить это локально с помощью docker -compose up. Я снял это на своем удаленном сервере и теперь пытаюсь использовать docker run username/srdc_prod:2020.07.26.

Когда я это делаю, я получаю сообщение об ошибке /docker-entrypoint.sh: line 10: exec: nginx: cannot execute: Is a directory. Выполнение docker-compose up отлично работает локально. Я хочу отправить sh этот образ в Docker Hub, вытащить его и запустить на моем удаленном сервере. Однако я не могу использовать docker-compose up, потому что файл docker-compose.yaml не существует удаленно. Я понимаю, что могу попробовать клонировать свое репозиторий GitHub удаленно, а затем запустить docker-compose up, но это не дает возможности отправить контейнер в DockerHub и, в конечном итоге, настроить CI / CD.

Есть ли способ запустить docker -составить на контейнере? Или можно увидеть все выполненные команды? Я видел в этот вопрос , что я могу использовать docker ps --no-trunc, чтобы увидеть все команды, выполняемые для запуска docker контейнеров, но все они полагаются на файл docker-entrypoint.sh, с которым я не могу выполнить удаленно. Я все делаю неправильно, и мне нужно реорганизовать мой Dockerfile для работы на удаленном сервере?

Изображение на удаленном сервере

username@ubuntu-512mb-name:~$ docker image ls
WARNING: Error loading config file: /home/username/.docker/config.json: stat /home/username/.docker/config.json: permission denied
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
username/srdc_prod        2020.07.26          af62927882ee        5 days ago          504MB

docker -entrypoint. sh

  1 #!/bin/bash
  2
  3 echo "Collect static files"
  4 python manage.py collectstatic --noinput
  5
  6 echo "Apply database migrations"
  7 python manage.py migrate --noinput
  8
  9 echo "Starting daphne server"
 10 exec "$@" # offending line

Dockerfile

FROM python:3-alpine

# set env vars
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir /app

RUN apk update && apk add --no-cache postgresql-dev gcc libffi-dev musl-dev build-base python3-dev bash

COPY requirements.txt /app/requirements.txt
RUN pip install --upgrade pip && pip install --no-cache-dir -r /app/requirements.txt

COPY test-requirements.txt /app/test-requirements.txt
RUN pip install --upgrade pip && pip install --no-cache-dir -r /app/test-requirements.txt

COPY . /app
# set working directory
WORKDIR /app

RUN mkdir -p /var/www/srdc/static/
RUN chmod 755 /var/www/srdc/static/

EXPOSE 8000

ENV DJANGO_SETTINGS_MODULE=srdc.settings

CMD ["nginx", "-g", "daemon off;"]

ADD docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

docker -compose.yml

version: '3'

services:
  django_web:
    build: .
    command: bash -c "daphne -b 0.0.0.0 -p 8000 srdc.asgi:application"
    expose:
       - 8000
    image: srdc:v0
    container_name: srdc_django_web
    volumes:
      - .:/app
      - static_volume:/var/www/srdc/static/
    depends_on:
      - db
  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - static_volume:/var/www/srdc/static/
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    depends_on:
      - django_web
  db:
    image: postgres
    container_name: "my_postgres"
    ports:
      - "54320:5432"
    volumes:                                                                                                                                                                                     - my_dbdata:/var/lib/postgresql/data
volumes:                                                                                                                                                                                       my_dbdata:
    static_volume:                                                                                                                                                                             media_volume:

1 Ответ

1 голос
/ 01 августа 2020

Вы видите ошибку: nginx - это каталог. Исходя из вашего набора docker-compose.yml, в вашем каталоге root есть папка nginx, которую вы используете в качестве контекста сборки для своей службы nginx.

  nginx:
    build: ./nginx # Here's the evidence for the nginx folder.
    ports:

Когда вы создаете django_web image, вы копируете весь контекстный каталог в /app, включая каталог nginx.

COPY . /app
# set working directory
WORKDIR /app

CMD для вашего username/srdc_prod изображения - nginx -g daemon off;, docker-entrypoint.sh выполняется. Это не удается, потому что nginx - это каталог.

Исходя из вашего docker-compose.yml манифеста, похоже, что CMD, который вы действительно хотите, это daphne -b 0.0.0.0 -p 8000 srdc.asgi:application или что-то в этом роде, но не nginx, которое не установлен в этом образе на основе alpine.

Некоторые рекомендации выходят за рамки вопроса.

  1. Если вы используете docker -compose в dev, подумайте об использовании этого в ваших размещенных средах, вместо того, чтобы запускать необработанные команды docker run.
  2. А еще лучше использовать Docker в режиме роя. Таким образом вы можете повторно использовать свой файл манифеста, хотя вам нужно будет удалить некоторые устаревшие вещи (например, depends_on) и немного расширить определения служб. Использование режима роя или какого-либо другого инструмента оркестровки упростит масштабирование вашего сервиса в будущем, плюс вы получите некоторые другие удобные функции, такие как секреты, политики перезапуска, сегрегация сети и т. Д.
...