是否有一种方法可以避免每次我修改源代码时重建我的Docker形象?
我认为我已经对我的Dockerfile进行了足够的优化,以减少构建时间,但是它总是需要2个命令和一些等待时间,有时只是添加了一行代码。它比简单的CTRL +S更长,并检查结果。
对于代码中的每个小更新,我必须执行的命令如下:
docker-compose down
docker-compose build
docker-compose up这是我的Dockerfile:
FROM python:3-slim as development
ENV PYTHONUNBUFFERED=1
COPY ./requirements.txt /requirements.txt
COPY ./scripts /scripts
EXPOSE 80
RUN apt-get update && \
apt-get install -y \
bash \
build-essential \
gcc \
libffi-dev \
musl-dev \
openssl \
wget \
postgresql \
postgresql-client \
libglib2.0-0 \
libnss3 \
libgconf-2-4 \
libfontconfig1 \
libpq-dev && \
pip install -r /requirements.txt && \
mkdir -p /vol/web/static && \
chmod -R 755 /vol && \
chmod -R +x /scripts
COPY ./files /files
WORKDIR /files
ENV PATH="/scripts:/py/bin:$PATH"
CMD ["run.sh"]这是我的docker-compose.yml文件:
version: '3.9'
x-database-variables: &database-variables
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
x-app-variables: &app-variables
<<: *database-variables
POSTGRES_HOST: ${POSTGRES_HOST}
SPOTIPY_CLIENT_ID: ${SPOTIPY_CLIENT_ID}
SPOTIPY_CLIENT_SECRET: ${SPOTIPY_CLIENT_SECRET}
SECRET_KEY: ${SECRET_KEY}
CLUSTER_HOST: ${CLUSTER_HOST}
DEBUG: 0
services:
website:
build:
context: .
restart: always
volumes:
- static-data:/vol/web
environment: *app-variables
depends_on:
- postgres
postgres:
image: postgres
restart: always
environment: *database-variables
volumes:
- db-data:/var/lib/postgresql/data
proxy:
build:
context: ./proxy
restart: always
depends_on:
- website
ports:
- 80:80
- 443:443
volumes:
- static-data:/vol/static
- ./files/templates:/var/www/html
- ./proxy/default.conf:/etc/nginx/conf.d/default.conf
- ./etc/letsencrypt:/etc/letsencrypt
volumes:
static-data:
db-data:发布于 2021-11-29 18:03:14
快速回答
是否有一种方法可以避免每次修改源代码时重建我的Docker映像?
如果你的应用程序需要一个构建步骤,你不能跳过它。
在您的示例中,您可以在python之前安装,因此在每次修改源代码时,您只需要运行您的python,而不是整个堆栈:post话母、代理等等。
码头目的
主要的对接目标或特性是使开发人员能够将应用程序打包到易于在任何地方部署的容器中,从而简化您的基础设施。
因此,从这个意义上说,停靠并不严格地适用于开发阶段的。在开发阶段,程序员应该使用专门的IDE (eclipse、intellij、visual等)来创建和更新源代码。另外,一些语言,如java、c#和框架(如react/ languages )需要一个构建阶段的。
这些IDE具有热重加载(源代码更改时自动更新应用程序)、变量和方法自动完成等功能。这些特性可以减少开发人员的时间。
开发人员更改源代码的Docker
不是主要目标,但如果您没有专门的ide,或者您在一个非常有限的开发人员工作区(没有管理权限、网络限制、windows、端口等),码头可以拯救您的。
如果您是一个java开发人员(例如),您需要在您的机器上安装java和一些IDE,比如eclipse、配置maven等等。使用docker,您可以使用所有所需的技术创建一个映像,建立--在您的源代码和码头容器之间建立一种连接。这个连接在坞中称为卷。
docker run --name my_job -p 9000:8080 \
-v /my/python/microservice:/src \
python-workspace-all-in-one在前面的示例中,您可以直接在/my/python/microservice上编码,只需输入my_job并运行python /src/main.py。它将在没有python或主机上的任何要求的情况下工作。一切都将在python-workspace-all-in-one
对于需要构建过程的技术: java & c#,需要时间限制,因为开发人员应该对任何源代码更改执行构建。正如我所解释的,在使用专门化的ide时并不需要这样做。
我的例子是不需要构建过程的技术,比如: php,仅仅是库/依赖项安装,docker的工作方式与专用IDE几乎一样。
本地发展用热装码头
在你的例子中,你的应用是基于python的。Python不需要构建过程。只需安装库,所以如果您想使用docker (而不是传统的方法)使用python进行开发:安装python、执行python app.py等,您应该遵循以下步骤:
不要将源代码复制到container
上的源代码->内部文件夹
这里是一个使用热重加载的python框架的示例:
FROM python:3
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app
RUN pip install -r requirements.txt
CMD [ "mkdocs", "serve", "--dev-addr=0.0.0.0:8000" ]以及如何构建开发版本:
docker build -t myapp-dev .以及如何使用卷运行它来同步您的开发人员更改的:
docker run --name myapp-dev -it --rm -p 8000:8000 -v $(pwd):/usr/src/app mydocs-dev总之,这将是在开发阶段使用docker运行应用程序的流程:
在应用程序(数据库、app等)之前启动需求,如果可以在python < code >F 161< browser上使用某种热重载库,则
<代码>H 160。
无热装填的地方开发码头
如果不能使用热重新加载库,则无论何时需要测试源代码修改,都需要构建和运行。在这种情况下,您应该将源代码复制到容器中,而不是按照前面的方法与卷同步:
FROM python:3
RUN mkdir -p /usr/src/app
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN pip install -r requirements.txt
RUN mkdocs build
WORKDIR /usr/src/app/site
CMD ["python", "-m", "http.server", "8000" ]应采取以下步骤:
在应用程序(数据库、apis等)之前,stage
docker build -t myapp-dev.docker run --name myapp-dev -it --rm -p 8000:8000 mydocs-dev发布于 2021-11-29 14:04:57
通过docker-compose.yml将脚本文件直接装入容器中
volumes:
- ./scripts:/scripts
- ./files:/files请记住,如果在Dockerfile中使用WORKDIR,则必须使用前缀。
https://stackoverflow.com/questions/70155930
复制相似问题