创建自定义Docker镜像

时间:2016-08-06 12:42:19

标签: node.js ubuntu docker

我正在尝试了解如何创建自定义图像。

我正在使用node.js中的应用程序,并使用catdoc从文本文件中提取文本。

我确实通过dockerhub拉出办公室node.js图片:

git pull node

通过命令运行图像:

docker run -p 8080:3000 -v $(PWD):/my-app -w "/my-app" node npm start

我的应用程序打开了一个调用catdoc的child_process,但是它没有用,显然是因为它是一个node.js图像,所以我试过了:

docker exec <node_container_id> apt-get install catdoc

然后返回:

Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package catdoc

我试图理解......这个图像没有ubuntu,所以我想“我会下载ubuntu并将cat.oc与node.js放在那里”......但是,嗯......不起作用:

docker exec <ubuntu_container_id> apt-get node

返回:

rpc error: code = 2 desc = oci runtime error: exec failed: exec: "apt-get": executable file not found in $PATH

我做错了什么?我该怎么办?我已经阅读了几个教程,但我没有得到它......

提前致谢。

2 个答案:

答案 0 :(得分:0)

根据Dockerfile,Docker Hub上的官方节点映像基于Jessie(Debian)。 Docker镜像通常尽可能紧凑,这意味着在创建图像之前会刷新apt缓存之类的内容。

您的apt-get install catdoc失败,因为apt包列表为空。如果您之前运行apt-get update,它应该可以运行:

$ docker run --rm -ti node bash

root@5ef87ec1e333:/# apt-get update
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Ign http://httpredir.debian.org jessie InRelease                                  
Get:2 http://security.debian.org jessie/updates/main amd64 Packages [374 kB]
Get:3 http://httpredir.debian.org jessie-updates InRelease [142 kB]           
Get:4 http://httpredir.debian.org jessie Release.gpg [2373 B]                            
Get:5 http://httpredir.debian.org jessie Release [148 kB]   
Get:6 http://httpredir.debian.org jessie-updates/main amd64 Packages [17.6 kB]
Get:7 http://httpredir.debian.org jessie/main amd64 Packages [9032 kB]
Fetched 9780 kB in 5s (1762 kB/s)   
Reading package lists... Done

root@5ef87ec1e333:/# apt-get install catdoc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  tk wish
The following NEW packages will be installed:
  catdoc
0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded.
Need to get 650 kB of archives.
After this operation, 2504 kB of additional disk space will be used.
Get:1 http://httpredir.debian.org/debian/ jessie/main catdoc amd64 0.94.4-1.1 [650 kB]
Fetched 650 kB in 0s (679 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package catdoc.
(Reading database ... 21090 files and directories currently installed.)
Preparing to unpack .../catdoc_0.94.4-1.1_amd64.deb ...
Unpacking catdoc (0.94.4-1.1) ...
Processing triggers for mime-support (3.58) ...
Setting up catdoc (0.94.4-1.1) ...

root@5ef87ec1e333:/# catdoc 
Usage:
 catdoc [-vu8btawxlV] [-m number] [-s charset] [-d charset] [ -f format] files

您可能希望编写自己的Dockerfile来创建包含Node,catdoc以及您可能需要的任何工具的图像,并将容器基于该图像而不是官方图像。例如,创建一个包含Dockerfile的文件(有关rm命令的详细信息,请参阅documentation):

FROM node

RUN apt-get update && \
    apt-get install catdoc && \
    rm -rf /var/lib/apt/lists/*

然后使用docker build -t="test:test" .构建您的图像,并根据它创建一个容器:

$ docker run --rm -ti test:test bash
root@eb7f087a2cbd:/# catdoc 
Usage:
 catdoc [-vu8btawxlV] [-m number] [-s charset] [-d charset] [ -f format] files

答案 1 :(得分:0)

我猜你真正的问题是......

问:&#34;我可以在NodeJS图片上安装catdoc吗?如果是的话,为什么我这样做时会看到错误?&#34;

是的,您可以从Dockerhub自定义官方NodeJS映像以包含catdoc可执行文件。事实上,你非常接近。您之所以看到这些错误只是因为您错过了apt-get update步骤。

但是,您可能希望在图像级别上执行此操作而不是将其安装在容器上?这样,无论何时旋转nodeJS容器,都不必重新安装catdoc

为此,您可以通过添加以下2行来修改下载的NodeJS Dockerfile。

# Installs catdoc executable onto the NodeJS ubuntu image
RUN apt-get update
RUN apt-get install catdoc

然后像往常一样构建图像。
示例:docker build -t nodewithcatdoc:test .

通过执行docker run命令启动容器形成构建的映像,您应该准备好定制的NodeJS + CatDoc容器。