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

image-20240904150136408

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 命令,可以将容器的存储层保存下来称为镜像。也就是说在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们在运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

image-20240904150509213

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

image-20240904151905160

利用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

image-20240904160308999

image-20240904160331481



利用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]