Dockerfile CMD 执行多个命令

案例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM adoptopenjdk/openjdk8:centos

#正确
#CMD /bin/sh -c "touch /a1 ; /bin/bash"

#错误,只执行前面一个
#CMD /bin/sh -c "/bin/bash ; touch /a1"

#正确
#CMD touch /a1 ; /bin/bash

#错误,只执行前面一个
#CMD /bin/bash ; touch /a1


# docker build -f a -t a . ; docker rm -f a1 ; docker run --name a1 -itd a ; docker exec -it a1 bash

案例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
FROM adoptopenjdk/openjdk8:centos

RUN yum -y update && yum -y install gcc \
pcre-devel \
openssl-devel \
zlib-devel

WORKDIR /home

ADD nginx-1.18.0.tar.gz .

COPY junit.jar .

RUN mkdir /home/nginx ; \
cd nginx-1.18.0 ; \
./configure --prefix=/home/nginx ; \
make && make install ; \
ln -s /home/nginx/sbin/nginx /usr/bin ; \
rm -rf /home/nginx-1.18.0



#正确
#CMD /bin/sh -c "nginx ; java -jar /home/junit.jar"

#正确
CMD nginx ; java -jar /home/junit.jar

#错误,只执行前面一个
#CMD java -jar /home/junit.jar ; nginx

#错误,“RUN nginx” 失效,只有下面那么 CMD 可以使用
#RUN nginx
#CMD java -jar /home/junit.jar

#前面两个执行,后面一个不执行
#官方推荐一个容器只执行一个容器,可以使用“docker logs 容器名”查看日志,不清楚查看哪个日志
#CMD nginx ; java -jar /home/junit.jar ; java -jar -Dserver.port=1234 /home/junit.jar

结果

1、尽量一个 CMD 只使用一个命令
2、如果想使用多个命令,也可以使用 CMD xxx.sh 脚本
3、若真用到多个命令,像上面 java .. /bin/bash 这种尽量写在最后(具体原因,不太清楚)
4、最后用多个容器进行管理,若真想合成一个可以当另外一个服务当成基础镜像