Docker构建镜像(commit & Dockerfile)
选项 |
作用 |
--name |
自定义容器名 |
-d |
放后台运行 |
-it |
分配一个交互式的终端 |
-p |
端口映射 |
-P |
映射随机端口 |
-v |
数据卷映射 |
-e |
env指定环境变量 |
--restart=always |
设置容器开机自启(跟随docker启动) |
--link=mysql |
指定另一个容器的名字,则可以通信类似于dns解析 |
利用Docker的commit制作镜像
### commit 语法
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。当我们使用Docker Hub的镜像无法满足我们的需求时,我们就需要自己定制镜像来满足我们的需求。
镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层。
######## 简单示例Docker的commit #########
1. -----# 起一个nginx
docker run --name webServer -d -p 80:80 nginx:1.11
2. -----# 对镜像进行更改
docker exec -it webServer /bin/bash
echo '<h1>Hello Docker Nginx Server from [email protected] </h1>' >/usr/share/nginx/html/index.html
修改了容器的文件,也就是改动了容器的存储器,可以通过 docker diff 命令查看具体的改动
# 可以通过docker diff 查看对镜像做了那些更改
# A 代表该路径是一个文件
# C 代表该路径是一个路径
[root@docker01 ~]# docker diff webServer
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
现在我们定制好了变化,我们希望能将其保存下来形成镜像。要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储器里。而Docker提供了一个 docker commit 命令,可以将容器的存储层保存下来称为镜像。也就是说在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们在运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
3. ----# 对镜像进行打包
docker commit \
--author "K J T<[email protected]>" \ # 作者
--message "修复了默认首页" \ # 信息
webServer \
nginx:v1
[root@docker01 ~]# docker commit \
> --author "K J T<[email protected]>" \
> --message "修复了默认首页" \
> webServer \
> nginx:v1
sha256:8c22e3e77c70ca82b3cce84d9a6fcf0242119df88c16c05126819db77bf32ce7
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 8c22e3e77c70 9 seconds ago 183MB
[root@docker01 ~]# docker inspect nginx:v1
"nginx:v1"
"Parent": "sha256:5766334bdaa0bc37f1f0c02cb94c351f9b076bcffa042d6ce811b0fd9bc31f3b",
"Comment": "修复了默认首页",
"Created": "2024-09-04T07:12:44.698428214Z",
"DockerVersion": "26.1.4",
"Author": "K J T<[email protected]>",
### 查看nginx:v1的修改历史
[root@docker01 ~]# docker history nginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
8c22e3e77c70 3 minutes ago nginx -g daemon off; 62B 修复了默认首页
5766334bdaa0 7 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 7 years ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0B
<missing> 7 years ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 7 years ago /bin/sh -c echo "deb http://nginx.org/packag… 59.1MB
<missing> 7 years ago /bin/sh -c set -e; NGINX_GPGKEY=573BFD6B3D8… 4.9kB
<missing> 7 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.13… 0B
<missing> 7 years ago /bin/sh -c #(nop) MAINTAINER NGINX Docker M… 0B
<missing> 7 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 years ago /bin/sh -c #(nop) ADD file:4eedf861fb567fffb… 123MB
###### 测试nginx:v1 #####
docker run --name web1 -d -p 81:80 nginx:v1
利用commit 制作一个 wordpress 镜像
1 #### 开一个center:7 的容器
docker run --name wp -p 80:80 -it centos:7 /bin/bash
2 #### 更换源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo
cat > /etc/yum.repos.d/php.repo <<EOF
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
EOF
3 #### 安装 nginx php mariadb
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb mariadb-server nginx
4 #### 修改 nginx php 配置文件
useradd www -s /sbin/nologin -M
/etc/nginx/nginx.conf # 修改主配置文件和启动用户
/etc/nginx/conf.d/wp.conf # 添加虚拟主机
/etc/php-fpm.d/www.conf # 修改php启动用户
server {
listen 80;
server_name _;
root /code/wordpress;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
5. #### 创建数据库
cat /usr/lib/systemd/system/mariadb.service ### 用来查看启动命令
ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
/usr/libexec/mariadb-prepare-db-dir %n && /usr/bin/mysqld_safe --basedir=/usr &
mysql
MariaDB [(none)]> create database wp;
MariaDB [(none)]> grant all on wp.* to wp@'localhost' identified by '123';
6. #### 上传修改wp网站文件
docker cp wordpress.tgz wp:/code
tar xf wordpress.tgz
cp wp-config-sample.php wp-config.php
vi wp-config.php
define( 'DB_NAME', 'wp' );
define( 'DB_USER', 'wp' );
define( 'DB_PASSWORD', '123' );
define( 'DB_HOST', 'localhost' );
chown www.www /code -R
7. #### 清理空间
yum clean all
rm -rf /etc/yum.repo.d
rm -f /code/wordpress.tgz
8. #### 编写启动脚本
vi /start.sh
#!/bin/bash
/usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf
/sbin/nginx
/usr/bin/mysqld_safe --basedir=/usr
9. #### commit 打包
docker commit \
--author "K J T<[email protected]>" \
--message "一个集成数据库的wp网站" \
wp \
wp:v1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wp v1 2a36a2e1ff37 19 seconds ago 615MB
10. #### 测试打包的wp
docker run --name wp1 -d wp:v1 /bin/sh /start.sh
利用Dockerfile制作镜像
FROM:指定一个基础的镜像
RUN:指定系统命令
CMD:指定运行容器PID为1的进程命令(给ENTRYPOINT执行的脚本进行传参)
ENTRYPOINT:指定运行容器PID为1的进程命令 /bin/sh /start.sh
ADD:将宿主机上的文件docker cp到容器中(会自动解压压缩包)
COPY:将宿主机上的文件docker cp到容器中(不自动解压)
WORKDIR:指定一个工作目录,docker exec连接进去时,自动进入该目录下
EXPOSE:声明端口
VOLUME:声明可映射的数据卷
ENV:声明默认环境变量
-----
LABEL:打标签
MAINTAINER:声明管理者标识
Dockerfile介绍
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
声明式的脚本,将镜像构建内容,写入脚本中即可。
Dockerfile 是一个文本文件,其内包含了一条条的指定(Instruction),每一条指令构建一层,因此每一条指定的内容,就是描述该层应当如何构建。
通过使用build 命令,根据Dockerfile的描述来构建镜像
通过源代码的方式
通过标准输入流的方式
通过源代码的路径:
Dockerfile需要放置在项目的跟目录位置
在构建的时候,Dockerfile client会把整个context打包发送到Docker Server端,然后由server端负责build镜像,在构建成功后,会删除发送的context目录
docker build -t {镜像名字} {项目的路径可以是相对路径}
通过标准输入流:
通过标准输入流的方式获取Dockerfile的内容
client不会打包上传context目录,因此对于一些ADD、COPY等涉及host本地文件复制的操作不能够支持
docker build -t {镜像名字} - < Dockerfile路径
FROM指定基础镜像
所谓的定制镜像,必须是以一个镜像为基础,在其上进行定制。一个 Dockerfile 中的 FROM 是必备的指定,并且必须是第一条指令。
FROM {bash镜像}
FROM centos:7
RUN命令
RUN 指令是用来执行命令行命令的,一个Dockerfile可以包含多个 RUN,按照定义顺序执行。
# RUN 支持两种运行格式:
1. shell 格式:RUN <cmd>,这个会当做/bin/sh -c “cmd” 运行,就像直接在命令行中输入的命令一样。
2. exec 格式:RUN ["可执行文件", "参数1", "参数2", ...],Docker 把它当做json的顺序来解析,必须使用双引号,且可执行文件必须是完整路径。
COPY复制文件
格式:
COPY <源路径> ... <目标路径>
COPY ["<源路径1>", ... "<目标路径>"]
和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。
[root@server myCentos]# vim Dockerfile #编辑Dockerfile
FROM centos
COPY file.txt /mydir/
COPY dir /mydir/
[root@server myCentos]# ls #查看宿主主机的当前的测试文件
dir Dockerfile file.txt
[root@server myCentos]# ls dir/ #查看宿主机的当前的测试文件
test1.txt test2.txt test3.txt test4.txt test5.txt
[root@cc87d839493f /]# ls mydir/ #查看容器内的mydir文件夹
dir file.txt
[root@cc87d839493f /]# ls mydir/dir/ #查看容器内mydir文件夹下面的dir文件夹的文件
test1.txt test2.txt test3.txt test4.txt test5.txt
<目标路径> 可以是容器内的相对路径,如果该路径不存在,会自动在复制文件前创建缺失目录,且<目标路径>也可以是相对路径(工作目录可以用WORKDIR 指令来指定)
如果是拷贝目录, 那么在 目标地址 也必须写上 拷贝的目录的名称 。否则是将该目录下的所文件拷贝到目标路径
还需注意一点,使用COPY指令,源文件的各种元数据都会保留,比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关的文件都在使用Git进行管理的时候。
ADD 更高级的复制文件
ADD 指令和COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
比如 <源路径> 可能是一个 URL,这种情况下,会自动去下载这个链接的文件到 <目标路径>里,下载完成的文件权限自动设置为 600,如果不是想要的权限,那么可以通过 RUN 进行权限调整。
如果 <源路径> 为一个 tar 压缩文件的话,或者压缩格式为 gzip,bzip以及xz 的情况下,ADD 指令会自动解压缩这个压缩文件到 <目标路径>去。
[root@server myCentos1]# vim Dockerfile #编写Dockerfile
FROM centos
ADD http://nginx.org/download/nginx-1.12.2.tar.gz /nginx/
ADD nginx-1.14.2.tar.gz /nginx/
[root@server myCentos1]# ls #编写完成查看当前目录下的文件
Dockerfile nginx-1.14.2.tar.gz
[root@197da52295fa /]# ls /nginx/ #查看nginx目录
nginx-1.12.2.tar.gz nginx-1.14.2
CMD 容器的启动命令
容器不是虚拟机,容器就是进程,既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定容器默认的主进程启动命令的。
CMD 指令有三种格式:
1. shell 格式: CMD <命令>
2. exec 格式:CMD ["可执行文件","参数1","参数2", ...]
3. 参数列表格式:CMD ["参数1","参数2",...] , 这个时候CMD作为 ENTRYPOINT的参数。
在指令格式上,一般推荐使用exec 格式,这类格式在解析时会被解析为JSON数组,因此一定要使用双引号 "" ,而不要使用单引号。
ENTRYPOINT 入口点
ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式 和shell格式。
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比CMD要繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为: ENTRYPOINT "<CMD>"
那么问题来了? 有了CMD ,为什么还要有ENTRYPOINT呢? 这种 ENTRYPOINT "<CMD>" 有什么好处呢?
ENV 设置环境变量
# 格式:
ENV <key><value>
ENV <key1>=<value1> <key2>=<value2>
这个指令很简单,就是设置环境变量,无论是后面的其它指令,如RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。
[root@server myCentos3]# cat Dockerfile #查看编辑好的Dockerfile文件内容
FROM centos
ENV name1 kjt1
ENV name2=kjt2 name3=kjt3
[root@server myCentos3]# docker build -t mycentos:v5 . #构建镜像
[root@server myCentos3]# docker run --rm -it --name test mycentos:v5 #启动一个容器,并以交互式启动
[root@b55929b2c63f /]# echo $name1 #进入容器后调用环境变量name1
kjt1
[root@b55929b2c63f /]# echo $name2 $name3 #调用环境变量name2,name3
kjt2 kjt3
ARG 构建参数
格式:
ARG <参数名>[=<默认值>]
构建参数和 ENV的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境和环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
Dockerfile 中的ARG指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。
解释:指定镜像构建使用的参数(如版本号等),可以在build的时候,使用–build-args改变。
例子:
ARG VERSION=1.0
RUN echo $VERSION
这行代码设置构建参数VERSION为1.0,并在构建过程中使用该参数
VOLUME 声明可映射的数据卷
格式:
VOLUME ["<路径1>","<路径2>"...]
VOLUME <路径>
容器运行时应该尽量保持容器存储层不会发生写操作,对于数据库类需要保存动态数据的应用,其数据文件应该保存在数据卷中,为了防止运行时忘记将动态文件所保存目录挂载为卷,在Dockerfile中,可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
[root@server myCentos4]# cat Dockerfile #编写Dockerfile文件,内容如下
FROM nginx
VOLUME /usr/share/nginx/html/
[root@server myCentos4]# docker build -t mynginx:v1 . #创建一个mynginx:v1的镜像
[root@server myCentos4]# docker run -it --rm --name nginx mynginx:v1 /bin/bash #利用mynginx:v1镜像启动一个名字叫做nginx的容器
root@eaa3ffb6dda7:/# ls /usr/share/nginx/html/ #查看nginx网站目录的文件
50x.html index.html
# 此时打开第二个终端,第一个终端不要关闭
[root@server ~]# docker inspect nginx #在第二个终端查看启动的nginx 容器挂载信息,会发现在宿主机上面自动挂载到了一个目录
"Mounts": [
...
"Source": "/var/lib/docker/volumes/47794aa178f1aa829d8e778f319a6bb678349926a8107f459fcb10d3b00ff8b5/_data",
...
],
[root@server ~]# ls /var/lib/docker/volumes/47794aa178f1aa829d8e778f319a6bb678349926a8107f459fcb10d3b00ff8b5/_data #查看挂载的目录,和容器中的目录一样,有同样的文件
50x.html index.html
[root@server ~]# echo "<h1>hello docker</h1>" >> /var/lib/docker/volumes/47794aa178f1aa829d8e778f319a6bb678349926a8107f459fcb10d3b00ff8b5/_data/test.html #在该目录添加文件
# 此时回到nginx容器启动的第一个终端
root@eaa3ffb6dda7:/# ls /usr/share/nginx/html/ #再次查看该目录会发现也有上面新添加的文件
50x.html index.html test.html
root@eaa3ffb6dda7:/# cat /usr/share/nginx/html/test.html #并且查看文件内容
<h1>hello docker</h1>
从上面可以看出,实际Dockerfile中只做了一件事,那就是将nginx网站目录挂载到了一个宿主机的一个匿名目录,且通过 docker inspect可以找到该目录,这样就实现了动态的更改网站数据目录的内容了。从而提高了灵活性。
EXPOSE 声明端口
格式:
EXPOSE <端口1> [<端口2>...]
EXPOSE 指令是声明运行容器时提供的服务端口,这只是一个声明,在运行时并不会因为这个声明就会开启这个端口的服务。在Dockerfile中写入这样的声明有两个好处,一个是帮助使用镜像者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射EXPOSE的端口。
WORKDIR 指定工作目录
格式:
WORKDIR <工作目录路径>
使用 WORKDIR 指令可以来制定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,则会自动创建。
可以为RUN、CMD、ENTRYPOINT指令配置工作目录,可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /home WORKDIR test。最终路径为/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home, WORKDIR $HOME/test也就是/home/test
[root@server myCentos5]# cat Dockerfile #查看编辑好的Dockerfile文件
FROM centos
WORKDIR /home/testdir
[root@server myCentos5]# docker build -t mycentos:v6 . #创建一个名字叫做mycentos:v6的镜像
[root@server myCentos5]# docker run --rm -it mycentos:v6 #使用上面创建的镜像启动一个容器
[root@4f7ae938d471 testdir]# pwd #进入容器后查看当前工作目录
/home/testdir
USER 指定当前用户
USER 和WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR是改变工作目录,USER 则是指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT 也会已该用户身份去运行命令。
当然,USER 只是能够切换到指定用户而已,这个用户必须事先建立好,否则无法切换。
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN ["redis-server"]
HEALTHCHECK 健康检查
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK 指令是告诉Docker 应该如何进行判断容器的状态是否正常
当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在HEALTHCHECK 指令检查成功后变为healthy, 如果连续一定次数失败,则变为 unhealthy。
HEALTHCHECK 支持下列选项:
--interval=<间隔>:两次健康检查的间隔,默认为30秒;
--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认30秒;
--retries=<次数>:当连续失败指定次数后,则将容器状态视为unhealthy,默认3次。
和CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。
在HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与 否:0:成功; 1 :失败; 2 :保留,不要使用这个值。
假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,我们可以用 curl 来帮助判断,其 Dockerfile 的 HEALTHCHECK可以这样写:
[root@server myNginx1]# cat Dockerfile
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
[root@server myNginx1]# docker build -t mynginx:v2 .
[root@server myNginx1]# docker run -d --name web -p 80:80 mynginx:v2
这里设置了每5秒检查一次(这里为了测试所以间隔非常短,实际应该相对较长),如果健康检查命令超过3秒没响应就视为失败,并且使用 curl -fs http://localhost/ || exit 1 作为健康检查命令。
当运行改镜像启动的容器后,可以通过 docker ps 看到最初的状态为(health:starting):
[root@server myNginx1]# docker ps
CREATED STATUS NAMES
6 seconds ago Up 4 seconds (health: starting) web
再等待几秒钟后,再次 docker ps,就会看到健康检查状态变成了 (healthy):
[root@server myNginx1]# docker ps
STATUS PORTS NAMES
Up 17 seconds (healthy) 0.0.0.0:80->80/tcp web
如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)。
Dockerfile构建 wordpress
1. #### 创建工作目录
mkdir /wp
[root@docker01 wp]# ll
total 18304
-rw-r--r-- 1 root root 1264 Sep 4 17:24 1.repo ## 集合了所有源的配置文件
-rw-r--r-- 1 root root 1165 Sep 4 17:26 nginx.cnf ## 集合了虚拟主机的配置文件
-rw-r--r-- 1 root root 18731751 Sep 4 17:33 wordpress.tgz ## 修改过变量打包的wp网页
-rw-r--r-- 1 root root 90 Sep 4 17:58 start.sh ## 启动脚本
[root@docker01 wp]# cat start.sh
#!/bin/bash
envsubst < 1.txt > 2.txt
/usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf
/sbin/nginx -g "daemon off;"
define( 'DB_NAME', '$WPDB_NAME' );
define( 'DB_USER', '$WPDB_USER' );
define( 'DB_PASSWORD', '$WPDB_PASSWD' );
define( 'DB_HOST', '$WPDB_HOST' );
FROM centos:7
RUN rm -rf /etc/yum.repos.d/* && useradd www -s /sbin/nologin -M && mkdir /code
COPY 1.repo /etc/yum.repos.d/1.repo
RUN yum install install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx -y \
&& yum clean all \
&& sed -i 's/user = apache/user = www/' /etc/php-fpm.d/www.conf \
&& sed -i 's/group = apache/group = www/' /etc/php-fpm.d/www.conf
COPY nginx.conf /etc/nginx/nginx.conf
ADD wordpress.tgz /code
RUN chown -R www.www /code/ && rm -f /code/wordpress.tgz
COPY start.sh /start.sh
CMD ["/bin/sh" "/start.sh"]
EXPOSE 80/tcp
WORKDIR /code/wordpress
VOLUME /code/wordpress
ENV WPDB_NAME=wp
ENV WPDB_USER=wp
ENV WPDB_PASSWD=wp
ENV WPDB_HOST=localhost
Author [email protected]