Docker-compose不能反映requirements.txt文件的更改。

13

当我运行时,我的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"]

我错过了什么?

编辑

像[在这里的被接受的答案一样,我已经将 requirements.txt 文件复制到在将整个应用程序添加到镜像之前的单独构建步骤中,但似乎并没有起作用。


Docker使用层缓存 https://semaphoreci.com/docs/docker/docker-layer-caching.html您需要复制您的要求文件 COPY - Yan Khonski
或者,您可以禁用缓存。 - Yan Khonski
这不是已经在上面的行中完成了吗 COPY ./requirements.txt /usr/src/app/requirements.txt - 8-Bit Borges
2个回答

16
我认为问题可能在于仅使用$ docker-compose up无法重新构建图像,如果您进行更改,则需要向docker-compose传递--build标志才能使docker-compose包括您对requirements.txt的更改。
即,运行以下命令: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命令的更多信息,请查看此处

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

要获取容器 ID,请运行:
docker ps

注意:`docker-compose ps` 命令将会给出容器名称,但是你需要容器 ID 才能通过 SSH 进入容器。

请您在回答中添加 $ docker-compose <command> 以运行这些更改,谢谢。 - 8-Bit Borges
嗯...不希望那样。这是绝对必要的吗? - 8-Bit Borges
当然可以,但我希望只安装requirements.txt中包含的内容,这是在开发过程中会更改的内容,而所有其他核心包(以前安装的所有包都需要很长时间)保持不变。 - 8-Bit Borges
只有最后一件事。上面的应用程序由4个图像/容器组成。只进入需要新软件包的容器,这样可以吗? - 8-Bit Borges
是的,您可以仅ssh一个容器在您的环境中。同样的事情也适用于删除,而不是使用“--rmi all”,您可以仅删除一个镜像。“--rmi your_image_tag” - Yan Khonski
1
我选择了另一个答案,因为它更符合我的需求,但我给你的回答点了赞,并感谢你的努力。 - 8-Bit Borges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接