首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从容器内的docker-compose命令运行shell脚本

从容器内的docker-compose命令运行shell脚本
EN

Stack Overflow用户
提问于 2019-09-08 17:44:52
回答 2查看 44K关注 0票数 10

我试图通过在docker容器中使用docker-compose来运行shell脚本。我正在使用Dockerfile构建容器环境并安装所有依赖项。然后,我将所有项目文件复制到容器中。据我所知,这工作得很好。(我对docker,docker-compose还是个新手)

我的Dockerfile:

代码语言:javascript
运行
复制
FROM python:3.6-alpine3.7

RUN apk add --no-cache --update \
    python3 python3-dev gcc \
    gfortran musl-dev \
    libffi-dev openssl-dev

RUN pip install --upgrade pip

ENV PYTHONUNBUFFERED 1
ENV APP /app

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir $APP
WORKDIR $APP

ADD requirements.txt .
RUN pip install -r requirements.txt

COPY . .

我目前正在尝试的是:

docker-compose文件:

代码语言:javascript
运行
复制
version: "2"

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "8000:8000"
      - "443:443"
    volumes:
      - ./:/app
      - ./config/nginx:/etc/nginx/conf.d
      - ./config/nginx/ssl/certs:/etc/ssl/certs
      - ./config/nginx/ssl/private:/etc/ssl/private
    depends_on:
      - api
  api:
    build: .
    container_name: app
    command: /bin/sh -c "entrypoint.sh"
    expose:
      - "5000"

这会导致容器无法启动,从日志中我得到了以下内容:

代码语言:javascript
运行
复制
/bin/sh: 1: entrypoint.sh: not found

有关更多参考和信息,请参阅我的entrypoint.sh脚本:

代码语言:javascript
运行
复制
python manage.py db init
python manage.py db migrate --message 'initial database migration'
python manage.py db upgrade
gunicorn -w 1 -b 0.0.0.0:5000 manage:app

基本上,我知道我可以在dockerfile的命令行中只使用上面的gunicorn行来运行容器。但是,我在app容器中使用sqlite db,并且确实需要运行db命令来初始化/迁移数据库。

仅供参考,这是一个基本的Flask python web应用程序,其中包含使用gunicorn的nginx反向代理。

任何洞察力都将受到感谢。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-08 18:15:16

首先,您要将entrypoint.sh复制到$APP,它是您从构建参数传递的,但您没有提到这一点。第二,您需要为entrypoint.sh设置权限。最好添加这三行,这样就不需要在docker-compose文件中添加command

代码语言:javascript
运行
复制
FROM python:3.6-alpine3.7
RUN apk add --no-cache --update \
    python3 python3-dev gcc \
    gfortran musl-dev \
    libffi-dev openssl-dev
RUN pip install --upgrade pip
ENV PYTHONUNBUFFERED 1
ENV APP /app
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir $APP
WORKDIR $APP
ADD requirements.txt .
RUN pip install -r requirements.txt

COPY . .
# These line for /entrypoint.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
entrypoint "/entrypoint.sh"

docker compose for api将是

代码语言:javascript
运行
复制
  api:
    build: .
    container_name: app
    expose:
      - "5000"

或者你可以使用你自己的也会工作的很好

代码语言:javascript
运行
复制
version: "2"

services:
  api:
    build: .
    container_name: app
    command: /bin/sh -c "entrypoint.sh"
    expose:
      - "5000"

现在你也可以使用docker run命令进行检查了。

代码语言:javascript
运行
复制
docker run -it --rm myapp
票数 15
EN

Stack Overflow用户

发布于 2019-09-08 17:50:09

需要使用其完整路径指定entrypoint.sh

从你的问题中不清楚它的确切安装位置;如果它在当前目录中,./entrypoint.sh应该可以工作。

(从切线上说,如果要运行单个脚本文件,则sh-c选项是多余的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57840820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档