Docker构建镜像--DockerFile

 

分类:docker服务器搭建
标签:docker容器docker composedockerdockerFile

2020-04-20 09:53:15.0 阅读原文

Docker 构建自定义的镜像:

$ docker build -t shykes/myapp . 
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

其中“.”为上下文路径,dockerFile中构建指令的上下文。

DockerFile指令:

FROM:自定义的镜像都是基于 FROM 的镜像,后面是基础镜像。

RUN: 用于执行后面跟着的命令行命令。有以下俩种格式:

FROM nginx
RUN ["./test.php", "dev", "offline"]
RUN ./test.php dev offline # 与上一行等价

多个RUN指令可以如下写,使用&&:

FROM centos
RUN yum install wget \
  && wget -O redis.tar.gz "http://.../redis.tar.gz" \
  && tar -xvf redis.tar.gz

CMD:同RUN,但是后面的命令在容器运行时才会执行。

COPY:从上下文目录中复制文件或者目录到容器里指定路径 。

COPY demo3-0.0.1-SNAPSHOT.jar app.jar

ADD:同COPY,推荐使用COPY。

ENTRYPOINT:同CMD,如果docker提供服务,则优先使用entrypoint。

ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV NODE_VERSION 7.2.0
ENV NODE_VERSION=7.2.0 # 与上一行等价

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/linux-x64.tar.xz"

在运行容器的时候,可以使用 docker run -e NODE_VERSION=7.3.1改变环境变量。

VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

volume是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下每个容器的volume都在host机器上的指定目录下/var/lib/docker/volumes。

VOLUME /tmp

EXPOSE:声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE 8082

示例,memcached的dockerFile

FROM debian:buster-slim

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd --system --gid 11211 memcache && useradd --system --gid memcache --uid 11211 memcache

# ensure SASL's "libplain.so" is installed as per https://github.com/memcached/memcached/wiki/SASLHowto
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
libsasl2-modules \
; \
rm -rf /var/lib/apt/lists/*

ENV MEMCACHED_VERSION 1.6.5
ENV MEMCACHED_SHA1 1ddb5f37f69946b63512ad0f89dc448ff7ba5713

RUN set -x \
\
&& savedAptMark="$(apt-mark showmanual)" \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
dpkg-dev \
gcc \
libc6-dev \
libevent-dev \
libio-socket-ssl-perl \
libsasl2-dev \
libssl-dev \
make \
perl \
wget \
&& rm -rf /var/lib/apt/lists/* \
\
&& wget -O memcached.tar.gz "https://memcached.org/files/memcached-$MEMCACHED_VERSION.tar.gz" \
&& echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \
&& mkdir -p /usr/src/memcached \
&& tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \
&& rm memcached.tar.gz \
\
&& cd /usr/src/memcached \
\
&& gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
&& enableExtstore="$( \
# https://github.com/docker-library/memcached/pull/38
case "$gnuArch" in \
# https://github.com/memcached/memcached/issues/381 "--enable-extstore on s390x (IBM System Z mainframe architecture) fails tests"
s390x-*) ;; \
*) echo '--enable-extstore' ;; \
esac \
)" \
&& ./configure \
--build="$gnuArch" \
--enable-sasl \
--enable-sasl-pwdb \
--enable-tls \
$enableExtstore \
&& make -j "$(nproc)" \
\
# see https://github.com/docker-library/memcached/pull/54#issuecomment-562797748 and https://bugs.debian.org/927461 for why we have to munge openssl.cnf
&& sed -i.bak 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf \
# TODO https://github.com/memcached/memcached/issues/382 "t/chunked-extstore.t is flaky on arm32v6"
&& make test \
&& mv /etc/ssl/openssl.cnf.bak /etc/ssl/openssl.cnf \
&& make install \
\
&& cd / && rm -rf /usr/src/memcached \
\
&& apt-mark auto '.*' > /dev/null \
&& apt-mark manual $savedAptMark > /dev/null \
&& find /usr/local -type f -executable -exec ldd '{}' ';' \
| awk '/=>/ { print $(NF-1) }' \
| sort -u \
| xargs -r dpkg-query --search \
| cut -d: -f1 \
| sort -u \
| xargs -r apt-mark manual \
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
\
&& memcached -V

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

USER memcache
EXPOSE 11211
CMD ["memcached"]
# docker-entrypoint.sh 文件
#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- memcached "$@"
fi

exec "$@"
# Dockerfile example
FROM centos
MAINTAINER John Doe (J.D.) <jd@example.com>
ENV PORT_TO_EXPOSE=4242
RUN echo Scratch running ...
RUN echo Scratch running ...
RUN echo Scratch running ...
RUN echo "String.... run line1"\
    && echo "String.... run line2"\
    && echo "String.... run line3"
CMD ["sh", "-c", "echo String....cmd"]
#ENTRYPOINT ["sh", "-c", "java -jar app.jar"]
EXPOSE $PORT_TO_EXPOSE 8080
VOLUME ["/my_files"]


分类:docker服务器搭建
标签:docker容器docker composedockerdockerFile

原文链接: Docker构建镜像--DockerFile 2020-04-20 09:53:15.0