【发布时间】:2020-11-22 03:24:06
【问题描述】:
TL;DR:当docker-compose up 工作正常时,/docker-entrypoint.sh: line 10: exec: nginx: cannot execute: Is a directory 运行 docker run username/srdc_prod:2020.07.26 时出现错误。
我有一个已推送到 DockerHub 的 docker 容器。我可以使用 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 在本地工作得很好。我想将此图像推送到 Docker Hub 并将其拉下并在我的远程服务器上运行它。但是,我不能使用docker-compose up,因为docker-compose.yaml 文件远程不存在。我意识到我可以尝试远程克隆我的 GitHub 存储库,然后运行 docker-compose up,但这违背了将容器推送到 DockerHub 并最终设置 CI/CD 的目的。
有没有办法在容器上运行 docker-compose up?或者是否可以看到所有执行的命令?我在this question 中看到我可以使用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:
【问题讨论】:
-
也许我遗漏了一些东西,但在你的 Dockerfile 中你似乎没有安装 nginx,但你的
CMD是nginx -g ...。该命令应该是daphne ...吗? -
有一个名为 'nginx' 的目录有一个 Dockerfile。我可能应该包括那个。
-
但这就是
Dockerfile的nginx服务,对吧?您的问题似乎与django_web服务有关,基于您正在运行的映像 (srdc_prod),它不需要nginx的Dockerfile。您列出了三个容器,看起来您在错误的容器中运行了nginx命令。
标签: python docker nginx docker-compose