每次更改源代碼時,有沒有辦法避免重建我的 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:
uj5u.com熱心網友回復:
通過docker-compose.yml以下方式將腳本檔案直接掛載到容器中:
volumes:
- ./scripts:/scripts
- ./files:/files
請記住,如果WORKDIR在 Dockerfile 中使用 a ,則必須使用前綴。
uj5u.com熱心網友回復:
快速回答
每次更改源代碼時,有沒有辦法避免重建我的 Docker 映像?
如果您的應用程式需要構建步驟,則不能跳過它。
同樣在你的情況下,你可以在 python 應用程式之前啟動需求,所以在每次修改源代碼時,你只需要構建和運行你的 python 應用程式,而不是整個堆疊:postgress、proxy 等
Docker 目的
docker 的主要目標或功能是使開發人員能夠將應用程式打包到易于部署在任何地方的容器中,從而簡化您的基礎設施。
所以,從這個意義上講,docker并不是嚴格意義上的開發者階段。在開發階段,程式員應該使用專門的 IDE(eclipse、intellij、visual studio 等)來創建和更新源代碼。
這些 IDE 具有熱多載(源代碼更改時自動更新應用程式)、變數和方法自動完成等功能。這些功能可以減少開發人員的時間。
Docker 用于開發人員更改源代碼
不是主要目標,但如果您沒有專門的 ide 或者您處于非常有限的開發人員作業區中,docker 可以拯救您
如果您是一名 Java 開發人員(例如),您需要在您的機器上安裝 Java 和一些 IDE,如 Eclipse,配置 maven 等。使用 docker,您可以創建一個包含所有必需技術的影像并建立一個型別源代碼和docker 容器之間的連接。docker 中的這個連接叫做Volumes
對于需要構建程序的技術:java 和 c#,會有時間損失,因為開發人員應該對任何源代碼更改執行構建。正如我所解釋的那樣,使用專門的 ide 不需要這樣做。
對于不需要構建程序的技術,例如:php,只需安裝庫/依賴項,docker 的作業方式幾乎與專用 IDE 相同。
使用熱多載進行本地開發的 Docker
在您的情況下,您的應用程式基于 python。Python 不需要構建程序。只是庫安裝,所以如果你想使用 docker而不是經典方式使用 python 進行開發:安裝 python,執行 python app.py等,你應該按照以下步驟操作:
- 不要將源代碼復制到容器中
- 只需將 requirements.txt 傳遞給容器
- 在容器內執行 pip install
- 在容器內運行你的應用程式
- 創建一個 docker 卷:您的源代碼 -> 容器上的內部檔案夾
這是一些帶有熱多載的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 運行您的應用程式的流程:
- 在應用程式(資料庫、apis 等)之前啟動需求
- 為開發階段創建一個特殊的 Dockerfile
- 為開發目的構建 docker 鏡像
- 運行應用程式,將源代碼與容器同步 (-v)
- 開發者修改源代碼
- 如果你可以在 python 上使用某種熱多載庫
- 該應用程式已準備好從瀏覽器打開
用于本地開發的 Docker,無需熱多載
如果您不能使用熱多載庫,則需要在想要測驗源代碼修改時構建和運行。在這種情況下,您應該將源代碼復制到容器中,而不是像之前的方法一樣與卷同步:
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 等)之前啟動需求
- 為開發階段創建一個特殊的 Dockerfile
- 開發者修改源代碼
- 建造
docker build -t myapp-dev.
- 跑
docker run --name myapp-dev -it --rm -p 8000:8000 mydocs-dev
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369489.html
標籤:码头工人 docker-compose 文件
