我的Dockerfile构建笔记

一、构建Docker镜像

# 构建容器

docker build -t 镜像名称 .
# 后面的. 指的是当前文件夹 (其实是Dockerfile存放的文件夹)
docker build --rm=true -t loen/lamp .

–rm 选项是告诉Docker,在构建完成后删除临时的Container,Dockerfile的某些指令(比如RUN、ADD、COPY)会创建临时的Container,这些临时生成的Container可以当做下次或者其他构建的缓存层,如果你确定不需要这些缓存,可以加上这个参数。

# 查看历史

docker history 镜像ID

# 格式化显示

docker history 镜像ID --format "table{{.ID}}=\n{{.CreatedBy}}" --no-trunc


二、Dockerfile最佳实践

参见我的这篇文章《Dockerfile最佳实践》


三、常见问题

1、解决Docker容器中文乱码问题:

执行如下命令即可:export LC_ALL=C.UTF-8

如果要制作Dockerfile,不能用export,环境变量要固化到镜像中,必须使用ENV:

ENV LC_ALL=C.UTF-8

或者另一种脚本方案:

echo 'export LC_ALL=C.UTF-8' >> /etc/profile


四、我的Dockerfile文件

例1、Tomcat快速测试版

# 源于tomcat官方镜像:https://hub.docker.com/_/tomcat
FROM tomcat:8.5.47-jdk8-corretto

#删除tomcat自带的app,然后设置正确的时区
RUN rm -rf /usr/local/tomcat/webapps/* \
    && export TZ=Asia/Shanghai \
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
    && echo $TZ > /etc/timezone \
    && unset TZ

#将target下的xx.war拷贝到/usr/local/tomcat/webapps/下
COPY target/*.war /usr/local/tomcat/webapps


例2、安装nodejs 和 vue的开发运行环境,运行 vue serve,访问http://localhost:8080/,显示App.vue的内容。

参见这个例子:

https://cli.vuejs.org/guide/prototyping.html


构建步骤一:基于node的vue环境基础镜像

FROM node
RUN npm install -g @vue/cli \
    && npm install -g @vue/cli-service-global \
    && mkdir /app
CMD ["./usr/local/bin/vue", "--version"]

建议使用stdin构建(无需上下文):

docker build -t vue-serve:latest -<<EOF
FROM node
RUN npm install -g @vue/cli \
    && npm install -g @vue/cli-service-global \
    && mkdir /app
CMD ["./usr/local/bin/vue", "--version"]
EOF


构建步骤二:vue app onbuild基础镜像

FROM vue-serve
WORKDIR /app
COPY docker-entrypoint.sh /app/
ONBUILD COPY . /app/
ENTRYPOINT ["/app/docker-entrypoint.sh"]

docker build -t vue-onbuild:latest .

注意,给dock-entrypoint.sh添加可执行权限。chmod +x *.sh


构建步骤三:业务app镜像

FROM vue-onbuild

docker build -t vue-xxxx:latest .


注意,这个例子的是当做开发环境运行。如果是测试环境,需要先build出target文件,然后放到Nginx等Web服务器上运行。build过程,可以使用docker的多阶段构建,或者使用容器云平台的pipline流水线。


例3、Nginx应用镜像

如下:

FROM nginx:1.17.4
#用本地的文件替换nginx镜像里的默认配置
COPY nginx.conf /etc/nginx/nginx.conf
#拷贝web文件到html目录
COPY dist/ /usr/share/nginx/html/

其中简单的nginx.conf如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # http server
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html;
	    #try_files $uri $uri/ /index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

}


例4、Fat Jar程序

Dockerfile如下:

# 源于亚马逊jdk官方镜像:https://hub.docker.com/_/amazoncorretto
FROM amazoncorretto:8

ADD target/xxxxxxx.jar .

EXPOSE 8080

# 环境变量 $JAVA_OPTS 在外部配置
ENTRYPOINT exec java $JAVA_OPTS -jar xxxxxxx.jar
# 常用的有:
#   -Dfile.encoding=UTF8
#   -Duser.timezone=GMT+08
#
#   -Xms256m -Xmx512m
#   -XX:+UseG1GC 
#   -XX:MaxGCPauseMillis=200
#
#   -Djava.security.egd=file:/dev/./urandom
#



© 2009-2020 Zollty.com 版权所有。渝ICP备20008982号