docker 制作 libreoffice镜像
一、dockerfile制作
FROM centos:7
ADD LibreOffice_6.4.3_Linux_x86-64_rpm.tar.gz /liberoffice/
# install LibreOffice
RUN yum install /liberoffice/LibreOffice_6.4.3.2_Linux_x86-64_rpm/RPMS/* -y \
&& rm -rf /liberoffice
# config ENV
ENV PATH /opt/libreoffice6.4/program:$PATH
# install dependency
RUN yum install cairo -y \
&& yum install cups-libs -y \
&& yum install libSM -y
# install font
RUN yum groupinstall "Fonts" -y \
&& yum clean all
# ADD jdk
ADD jdk-8u251-linux-x64.tar.gz /usr/local/
# config ENV
ENV PATH /usr/local/jdk1.8.0_251/bin:$PATH
# ADD App
ADD openoffice-demo-0.0.1-SNAPSHOT.jar /office/
# expose port
EXPOSE 8080
# run app
CMD ["java","-jar","/office/openoffice-demo-0.0.1-SNAPSHOT.jar"]
【注意事项】
1,ADD 文件 目录,其中目录最好以'/'
结尾
eg: ADD openoffice-demo-0.0.1-SNAPSHOT.jar /office/
二、构建镜像
【注意】不要忘了最后的'.'
docker build -t 容器名:tag .
docker build -t liberoffice4:1.0 .
三、运行镜像
docker run -itd -v 宿主机目录:容器目录 -p 宿主机端口号:容器端口号 --name 容器名 镜像名:镜像Tag
参数 | 含义 | 用法 | 备注 |
---|---|---|---|
-i | |||
-t | |||
-d | 以守护进程等的方式运行 | 命令行exit后容器不退出 | |
-v | 挂载主机目录到容器 | -v 宿主机目录:容器目录 | |
-p | 设置主机和容器的端口映射 | -p 宿主机端口号:容器端口号 | |
--name | 指定容器名 |
docker run -itd --name super_libreoffice -v /kbase/convert:/kbase/convert -p 8080:8080 libreoffice4:1.0

测试:
curl -X'GET' http://127.0.0.1:8080/convert/11.doc/11.pdf
四、镜像其他相关操作
1,移除容器
docker rm 容器名/容器id
【注】不能移除一个正在运行的容器
2,移除镜像
docker rmi 镜像名:Tag/镜像id
【注】镜像名和Tag如果不指定会为空,只有镜像id
3,停止容器
docker stop 容器名/容器id
4,列出状态为运行(Up xx)的容器
docker ps
5,列出所有状态(Up/Exited/Created)的容器
docker ps -a
6,列出本地所有的镜像
docker images
7,查看容器的日志
docker logs 容器id
【注】用于定位问题,eg:容器run正确返回数字串,却没有在docker ps列表中,可以通过该命令查看其它信息
8,docker run
9,docker exec
10, 启动一个退出的容器
docker start 容器id
11,宿主机向容器拷贝文件
docker cp 宿主机文件路径 镜像名称:容器目标文件路径
五、常用命令讲解
1. 挂载目录
-v 参数表示挂载目录 :
前为宿主机目录,:
后为docker容器中的目录
挂载目录后,宿主机和docker容器可以通过/kbase/convert/目录共享文件
docker run -itd -v /kbase/convert:/kbase/convert --name libreoffice libreoffice:1.0.0
docker exec -it libreoffice /bin/bash
2. 设置环境变量
docker中设置环境变量和在操作系统中设置环境变量是一样的,都是想要使得变量或者命令可以被全局引用或者操作系统自动定位识别命令路径
1)设置环境变量
-
编写dockerfile时设置环境变量推荐)
ENV <key><value>
-
容器运行时指定
使用docker run --env <key>=<value> <IMAGE-ID>
来修改环境变量
eg:
docker exec --env PATH=/opt/libreoffice6.4/:$PATH -it libreoffice /bin/bash
-
进入docker中设置环境变量
docker exec -it libreoffice /bin/bash
export PATH=/opt/libreoffice6.4/program/:$PATH
2)查看环境变量
docker exec -it <CONTAINER-NAME> OR <CONTAINER-ID> env
eg:
docker exec -it libreoffice env
容器外执行
容器内执行
soffice --headless --convert-to pdf /kbase/convert/11.doc --outdir /kbase/convert/
问题汇总
1. 运行soffice --headless --convert-to pdf /kbase/convert/11.doc --outdir /kbase/convert/
报错
Q1:error while loading shared libraries: libcairo.so.2
R1:yum install cairo
Q2:error while loading shared libraries: libcups.so.2
R2:yum install cups-libs
Q3:error while loading shared libraries: libSM.so.6
R3:yum install libSM
参考:
关于centos7安装libreoffice遇到的问题
使用libreoffice实现文档预览(linux)与docker镜像制作部署
2. Docker 错误 “port is already allocated” 解决方法
Docker 错误 “port is already allocated” 解决方法
3. Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused "rootfs_linux.go:58: mounting \"/kbase1/convert1\" to rootfs \"/var/lib/docker/overlay2/346b74abe69bc2b29cf8a57a2392d23cdb77e843b7bcb5c00e87055d53db9f4e/merged\" at \"/var/lib/docker/overlay2/346b74abe69bc2b29cf8a57a2392d23cdb77e843b7bcb5c00e87055d53db9f4e/merged/kbase/convert1\" caused \"not a directory\""": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
造成这个问题的可能有如下原因
1,只能挂载目录;挂载的不是一个目录,而是一个文件。
2,该目录已经被其他的docker容器挂载了。