Docker-compose 不反映 requirements.txt 中的变化
Docker-compose does not reflect changes in requirements.txt
当我 运行:
时,我的 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
文件,然后再将整个应用程序添加到映像中 , 但它似乎不起作用。
尝试从复制的文件安装要求
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
更新
如果你有 运行ning docker 并且你不想停止它并重建图像(如果你只想安装一个包或 运行 一些命令或甚至启动一个新的应用程序),您可以从本地计算机连接容器并使用 运行 命令行命令。
docker exec -it [CONTAINER_ID] bash
获得[CONTAINER_ID]
、运行
docker ps
注意 docker-compose ps
将为您提供容器名称,但您需要容器 ID 才能通过 ssh 连接容器。
我认为问题很可能是 $ 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。
当我 运行:
时,我的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
文件,然后再将整个应用程序添加到映像中 , 但它似乎不起作用。
尝试从复制的文件安装要求
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
更新
如果你有 运行ning docker 并且你不想停止它并重建图像(如果你只想安装一个包或 运行 一些命令或甚至启动一个新的应用程序),您可以从本地计算机连接容器并使用 运行 命令行命令。
docker exec -it [CONTAINER_ID] bash
获得[CONTAINER_ID]
、运行
docker ps
注意 docker-compose ps
将为您提供容器名称,但您需要容器 ID 才能通过 ssh 连接容器。
我认为问题很可能是 $ 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。