当前位置: 首页 > 知识库问答 >
问题:

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

尉迟宣
2023-03-14

我试图在docker容器中使用docker compose来运行shell脚本。我正在使用Dockerfile构建容器环境并安装所有依赖项。然后我将所有项目文件复制到容器中。据我所知,这很有效。(我对docker还是相当陌生的,docker撰写)

我的Dockerfile:

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编写文件:

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"

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

/bin/sh: 1: entrypoint.sh: not found

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

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行来运行容器。但是,我在应用程序容器中使用sqlite db,并且确实需要运行db命令来初始化/迁移数据库。

仅供参考,这是一个基本的flaskpythonweb应用程序,带有使用gunicorn的nginx反向代理。

如有任何见解,将不胜感激。谢谢

共有2个答案

暨宸
2023-03-14

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

你的问题不清楚你到底把它安装在哪里;如果它在当前目录中,/entrypoint.sh应该可以工作。

(如果要运行单个脚本文件,那么-c选项对sh来说是多余的。)

淳于兴朝
2023-03-14

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

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"

为api编写docker

  api:
    build: .
    container_name: app
    expose:
      - "5000"

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

version: "2"

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

现在您也可以使用docker运行命令进行检查。

docker run -it --rm myapp

 类似资料:
  • 问题内容: 我在一个应用程序上工作,但有一个关于从Java应用程序运行shell命令的问题。这是代码: 但是当我尝试执行命令时: myapp读取 为两个单独的参数。但是我只想读取一个参数。 当我直接从终端运行此命令时,它执行成功。 我试过,, 但对我没有工作。我如何才能将此参数作为一个参数读取。 问题答案: 我记得exec方法的重载分别为参数提供了一个参数。你需要用那个 对。就这个 只需将命令行和

  • 我想使用从gulp运行shell命令。我看到下面这个成语被用于gulpfile。 这是从吞咽任务中运行命令的惯用方法吗?

  • 我如何通过命令行运行它?

  • 问题内容: 如何通过外壳程序脚本执行SQL命令,以使其自动化? 我想使用外壳程序脚本恢复在SQL文件中收集的数据。我想连接到服务器并还原数据。通过SSH命令行单独执行时,该命令有效。 这是我使用的命令: 这是创建文件并将其通过管道传递到mysql 的Shell脚本代码。 正确的方法是什么? 问题答案: 您需要使用该标志来发送密码。这很棘手,因为您和密码之间必须没有空格。 如果在空格之后使mysql

  • 问题内容: 在pod内的容器中,如何使用kubectl运行命令?例如,如果我需要在容器内执行以下操作: kubectl得到豆荚 我已经试过了:在我的dockerfile中,我有以下命令: 编辑:我正在尝试OSX文件,我已将其更正为linux二进制文件。(由@svenwltr纠正 在创建docker文件时,这是成功的,但是当我在容器中运行kubectl get pod时, 我收到此错误: 与服务器的

  • 我一直在使用localstack开发一个针对Local的服务。我刚刚通过运行了他们的docker映像