【问题标题】:Docker-compose does not reflect changes in requirements.txtDocker-compose 不反映 requirements.txt 的变化
【发布时间】:2019-07-17 14:58:50
【问题描述】:

我的requirements.txt 中的更改在我运行时没有反映:

docker-compose -f docker-compose-dev.yml up -d

docker-compose-dev.yml

version: '3.6'

services:

  web:
    build:
      context: ./services/web
      dockerfile: Dockerfile-dev
    volumes:
      - './services/web:/usr/src/app'
    ports:
      - 5001:5000
    environment:
      - FLASK_ENV=development
      - APP_SETTINGS=project.config.DevelopmentConfig
      - DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev 
      - DATABASE_TEST_URL=postgres://postgres:postgres@web-db:5432/web_test  
    depends_on:  
      - web-db

  web-db:  
    build:
      context: ./services/web/project/db
      dockerfile: Dockerfile
    ports:
      - 5435:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  nginx:
    build:
      context: ./services/nginx
      dockerfile: Dockerfile-dev
    restart: always
    ports:
      - 80:80
    depends_on:
      - web
      - client

  client:
    build:
      context: ./services/client
      dockerfile: Dockerfile-dev
    volumes:
      - './services/client:/usr/src/app'
      - '/usr/src/app/node_modules'
    ports:
      - 3007:3000
    environment:
      - NODE_ENV=development
      - REACT_APP_WEB_SERVICE_URL=${REACT_APP_WEB_SERVICE_URL}
    depends_on:
      - web

Dockerfile-dev

# base image
FROM python:3.6-alpine

# install dependencies
RUN apk update && \
    apk add --virtual build-deps gcc python-dev musl-dev && \
    apk add libffi-dev && \
    apk add postgresql-dev && \
    apk add netcat-openbsd && \
    apk add bind-tools && \
    apk add --update --no-cache g++ libxslt-dev && \
    apk add jpeg-dev zlib-dev

ENV PACKAGES="\
    dumb-init \
    musl \
    libc6-compat \
    linux-headers \
    build-base \
    bash \
    git \
    ca-certificates \
    freetype \
    libgfortran \
    libgcc \
    libstdc++ \
    openblas \
    tcl \
    tk \
    libssl1.0 \
    "

ENV PYTHON_PACKAGES="\
    numpy \
    matplotlib \
    scipy \
    scikit-learn \
    nltk \
    " 

RUN apk add --no-cache --virtual build-dependencies python3 \
    && apk add --virtual build-runtime \
    build-base python3-dev openblas-dev freetype-dev pkgconfig gfortran \
    && ln -s /usr/include/locale.h /usr/include/xlocale.h \
    && python3 -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip3 install --upgrade pip setuptools \
    && ln -sf /usr/bin/python3 /usr/bin/python \
    && ln -sf pip3 /usr/bin/pip \
    && rm -r /root/.cache \
    && pip install --no-cache-dir $PYTHON_PACKAGES \
    && pip3 install 'pandas<0.21.0' \
    && apk del build-runtime \
    && apk add --no-cache --virtual build-dependencies $PACKAGES \
    && rm -rf /var/cache/apk/*

# set working directory
WORKDIR /usr/src/app

# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt  # <--- refer to EDIT
RUN pip install -r requirements.txt

# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh

RUN chmod +x /usr/src/app/entrypoint.sh

# add app
COPY . /usr/src/app

# run server
CMD ["/usr/src/app/entrypoint.sh"]

我错过了什么?

编辑

就像 [Docker how to run pip requirements.txt only if there was a change? 中接受的答案一样,我已经在一个单独的构建步骤中复制了requirements.txt 文件,然后再将整个应用程序添加到映像中,但它似乎没有工作。

【问题讨论】:

标签: docker docker-compose requirements.txt


【解决方案1】:

我认为问题可能在于如果您进行更改,仅$ docker-compose up 将不会重建您的图像。为了让docker-compose 包含您对requirements.txt 的更改,您需要将--build 标志传递给docker-compose

即改为运行:

docker-compose -f docker-compose-dev.yml up --build -d

这将强制 docker-compose 重建图像。但是,这将重建 docker-compose 文件中的所有图像,这可能需要也可能不需要。

如果您只想重建单个服务的映像,您可以先运行docker-compose -f docker-compose-dev.yml build web,然后再运行您原来的docker-compose 命令。

有关build 命令here 的更多信息。

【讨论】:

    【解决方案2】:

    尝试从复制的文件中安装需求

    https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

    这是他们的 Dockerfile

    的一个例子
    COPY requirements.txt /tmp/
    RUN pip install --requirement /tmp/requirements.txt
    

    这就是你所拥有的

    RUN pip install -r requirements.txt
    

    然后,在您更改 docker 文件后,您必须停止容器,删除镜像,构建一个新镜像,然后从中运行容器。

    停止容器并删除图像。

    docker-compose down
    docker-compose --rmi all
    

    --rmi all - 删除所有图像。您可能想使用--rmi IMAGE_NAME

    然后启动它(如果您不使用默认参数,请使用您的参数更改这些命令)。

    docker-compose up
    

    更新

    如果您正在运行 docker,但不想停止它并重建映像(如果您只想安装包或运行一些命令甚至启动新应用程序),您可以从本地连接容器机器并运行命令行命令。

    docker exec -it [CONTAINER_ID] bash
    

    要获取[CONTAINER_ID],请运行

    docker ps
    

    注意docker-compose ps 会给你容器名称,但你需要容器​​ id 来 ssh 容器。

    【讨论】:

    • 您能否将$ docker-compose &lt;command&gt; 添加到您的答案中以运行这些更改?
    • 哼..不希望那样。有必要吗?
    • 当然,但我希望只安装requirements.txt 中的内容,这是在开发过程中发生变化的内容,而之前安装的所有其他核心包(所有这些都需要很长时间才能安装)保持固定.
    • 最后一件事。上面的应用程序由 4 个图像/容器组成。只 bash 到需要新包的容器中可以吗?
    • 我接受了另一个答案,因为它最终对我的需求更有用,但我赞成你的,感谢你的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2021-07-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多