为Python项目构建Docker映像时如何避免重新安装软件包?

我的Dockerfile就像

FROM my/base

ADD . /srv

RUN pip install -r requirements.txt

RUN python setup.py install

ENTRYPOINT ["run_server"]

每次构建新映像时,都必须重新安装依赖项,这在我所在的地区可能非常慢。

我想到的cache已安装软件包的一种方法是my/base用较新的图像覆盖该图像,如下所示:

docker build -t new_image_1 .

docker tag new_image_1 my/base

因此,下一次我使用此Dockerfile进行构建时,我/基础已经安装了一些软件包。

但是此解决方案有两个问题:

  1. 并非总是可以覆盖基本图像
  2. 随着新图像的叠加,基础图像变得越来越大

那么我可以使用什么更好的解决方案来解决这个问题呢?

回答:

有关我机器上的docker的一些信息:

☁  test  docker version

Client version: 1.1.2

Client API version: 1.13

Go version (client): go1.2.1

Git commit (client): d84a070

Server version: 1.1.2

Server API version: 1.13

Go version (server): go1.2.1

Git commit (server): d84a070

☁ test docker info

Containers: 0

Images: 56

Storage Driver: aufs

Root Dir: /var/lib/docker/aufs

Dirs: 56

Execution Driver: native-0.2

Kernel Version: 3.13.0-29-generic

WARNING: No swap limit support

回答:

尝试使用以下Dockerfile进行构建。

FROM my/base

WORKDIR /srv

ADD ./requirements.txt /srv/requirements.txt

RUN pip install -r requirements.txt

ADD . /srv

RUN python setup.py install

ENTRYPOINT ["run_server"]

如果.(您的项目)有某些更改,则docker pip install通过使用缓存跳过行。

Docker仅pip install在您编辑requirements.txt文件时在构建上运行。


我写简单的Hello, World!程序。

$ tree

.

├── Dockerfile

├── requirements.txt

└── run.py

0 directories, 3 file

# Dockerfile

FROM dockerfile/python

WORKDIR /srv

ADD ./requirements.txt /srv/requirements.txt

RUN pip install -r requirements.txt

ADD . /srv

CMD python /srv/run.py

# requirements.txt

pytest==2.3.4

# run.py

print("Hello, World")

下面是输出。

Step 1 : WORKDIR /srv

---> Running in 22d725d22e10

---> 55768a00fd94

Removing intermediate container 22d725d22e10

Step 2 : ADD ./requirements.txt /srv/requirements.txt

---> 968a7c3a4483

Removing intermediate container 5f4e01f290fd

Step 3 : RUN pip install -r requirements.txt

---> Running in 08188205e92b

Downloading/unpacking pytest==2.3.4 (from -r requirements.txt (line 1))

Running setup.py (path:/tmp/pip_build_root/pytest/setup.py) egg_info for package pytest

....

Cleaning up...

---> bf5c154b87c9

Removing intermediate container 08188205e92b

Step 4 : ADD . /srv

---> 3002a3a67e72

Removing intermediate container 83defd1851d0

Step 5 : CMD python /srv/run.py

---> Running in 11e69b887341

---> 5c0e7e3726d6

Removing intermediate container 11e69b887341

Successfully built 5c0e7e3726d6

我只更新run.py并尝试再次构建。

# run.py

print("Hello, Python")

下面是输出。

Sending build context to Docker daemon  5.12 kB

Sending build context to Docker daemon

Step 0 : FROM dockerfile/python

---> f86d6993fc7b

Step 1 : WORKDIR /srv

---> Using cache

---> 55768a00fd94

Step 2 : ADD ./requirements.txt /srv/requirements.txt

---> Using cache

---> 968a7c3a4483

Step 3 : RUN pip install -r requirements.txt

---> Using cache

---> bf5c154b87c9

Step 4 : ADD . /srv

---> 9cc7508034d6

Removing intermediate container 0d7cf71eb05e

Step 5 : CMD python /srv/run.py

---> Running in f25c21135010

---> 4ffab7bc66c7

Removing intermediate container f25c21135010

Successfully built 4ffab7bc66c7

正如您在上面看到的,Docker使用构建缓存。这次我更新了requirements.txt。

# requirements.txt

pytest==2.3.4

ipython

下面是输出。

Sending build context to Docker daemon  5.12 kB

Sending build context to Docker daemon

Step 0 : FROM dockerfile/python

---> f86d6993fc7b

Step 1 : WORKDIR /srv

---> Using cache

---> 55768a00fd94

Step 2 : ADD ./requirements.txt /srv/requirements.txt

---> b6c19f0643b5

Removing intermediate container a4d9cb37dff0

Step 3 : RUN pip install -r requirements.txt

---> Running in 4b7a85a64c33

Downloading/unpacking pytest==2.3.4 (from -r requirements.txt (line 1))

Running setup.py (path:/tmp/pip_build_root/pytest/setup.py) egg_info for package pytest

Downloading/unpacking ipython (from -r requirements.txt (line 2))

Downloading/unpacking py>=1.4.12 (from pytest==2.3.4->-r requirements.txt (line 1))

Running setup.py (path:/tmp/pip_build_root/py/setup.py) egg_info for package py

Installing collected packages: pytest, ipython, py

Running setup.py install for pytest

Installing py.test script to /usr/local/bin

Installing py.test-2.7 script to /usr/local/bin

Running setup.py install for py

Successfully installed pytest ipython py

Cleaning up...

---> 23a1af3df8ed

Removing intermediate container 4b7a85a64c33

Step 4 : ADD . /srv

---> d8ae270eca35

Removing intermediate container 7f003ebc3179

Step 5 : CMD python /srv/run.py

---> Running in 510359cf9e12

---> e42fc9121a77

Removing intermediate container 510359cf9e12

Successfully built e42fc9121a77

码头工人不使用构建缓存。如果它不起作用,请检查您的码头工人版本。

Client version: 1.1.2

Client API version: 1.13

Go version (client): go1.2.1

Git commit (client): d84a070

Server version: 1.1.2

Server API version: 1.13

Go version (server): go1.2.1

Git commit (server): d84a070

以上是 为Python项目构建Docker映像时如何避免重新安装软件包? 的全部内容, 来源链接: utcz.com/qa/422770.html

回到顶部