Construção de Dockerfile de notas Docker

Docker Dockerfile

O que é Dockerfile?

Dockerfile é um arquivo de texto usado para construir uma imagem. O conteúdo do texto contém instruções e instruções para construir uma imagem.

Use Dockerfile para personalizar a imagem

Aqui apenas explica como executar o arquivo Dockerfile para personalizar um espelho. As instruções detalhadas no arquivo Dockerfile específico serão apresentadas na próxima seção. Aqui, você só precisa conhecer o processo de construção.

1. O seguinte é para personalizar um espelho nginx (o espelho construído terá um arquivo /usr/share/nginx/html/index.html)

Em um diretório vazio, crie um novo arquivo chamado Dockerfile e adicione o seguinte conteúdo ao arquivo:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

Insira a descrição da imagem aqui

2. A função das instruções FROM e RUN

FROM: As imagens personalizadas são todas baseadas em FROM, onde nginx é a imagem básica necessária para personalização. As operações subsequentes são baseadas no nginx.

RUN: usado para executar os comandos de linha de comando que se seguem. Existem dois formatos:

formato de casca:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

formato exec:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

Nota: Cada vez que as instruções do Dockerfile são executadas, uma nova camada será criada no docker. Portanto, muitas camadas sem sentido farão com que a imagem se expanda muito. Por exemplo:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

Como acima, conecte os comandos com o símbolo &&, para que após a execução, apenas 1 espelho de camada seja criado.

Comece a construir a imagem

No diretório de armazenamento do arquivo Dockerfile, execute a ação de construção.

O exemplo a seguir cria um nginx: test (nome da imagem: rótulo da imagem) do Dockerfile no diretório.

Nota: a última representa o caminho do contexto desta execução, que será apresentado na próxima seção.

$ docker build -t nginx:test .

Insira a descrição da imagem aqui
O display acima indica que a construção foi bem-sucedida.

Caminho de contexto

Na seção anterior, a última instrução foi mencionada, é o caminho do contexto, então qual é o caminho do contexto?

$ docker build -t nginx:test .

O caminho de contexto se refere a quando o docker está construindo um espelho, às vezes ele deseja usar os arquivos locais (como cópia). Depois que o comando docker build conhece esse caminho, ele empacota todo o conteúdo sob o caminho.

Análise: Porque o modo operacional do docker é C / S. Nossa máquina nativa é C, e o motor docker é S. O processo de construção real é concluído no mecanismo docker, portanto, nossos arquivos locais não podem ser usados ​​neste momento. Isso requer que os arquivos no diretório especificado de nossa máquina local sejam empacotados juntos para uso pelo mecanismo docker.

Se o último parâmetro não for especificado, o caminho do contexto padrão é o local do Dockerfile.

Nota: Não coloque arquivos inúteis no caminho do contexto, pois eles serão empacotados e enviados para o docker engine.Se houver muitos arquivos, o processo será lento.

Instruções detalhadas

CÓPIA DE

Copie instruções, copie arquivos ou diretórios do diretório de contexto para o caminho especificado no contêiner.

formato:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<caminho de origem>: arquivo de origem ou diretório de origem. Esta pode ser uma expressão curinga e sua regra curinga deve satisfazer a regra filepath.Match de Go. Por exemplo:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<Caminho de destino>: o caminho especificado no contêiner. O caminho não precisa ser construído com antecedência. Se o caminho não existir, ele será criado automaticamente.

ADICIONAR

A instrução ADD e COPY usam o mesmo formato (sob os mesmos requisitos, a recomendação oficial é usar COPY). As funções também são semelhantes, as diferenças são as seguintes:

A vantagem de ADD: Se o <arquivo de origem> for um arquivo compactado tar e o formato de compactação for gzip, bzip2 e xz, ele será automaticamente copiado e descompactado para o <caminho de destino>.
A desvantagem do ADD: É impossível copiar arquivos compactados com o tar sem descompactar. Isso invalidará o cache de criação da imagem, o que pode tornar a criação da imagem mais lenta. Se ele é usado ou não, pode ser determinado de acordo com a necessidade de descompactação automática.

CMD

Semelhante à instrução RUN, ela é usada para executar o programa, mas os pontos de tempo das duas são diferentes:

O CMD é executado durante a execução do docker.
RUN é executado durante a construção do docker.
Função: especifique o programa a ser executado por padrão para o contêiner iniciado, e o contêiner terminará quando o programa for executado. O programa especificado pela instrução CMD pode ser substituído pelo programa a ser executado especificado no parâmetro de linha de comando docker run.

Nota: Se houver várias instruções CMD no Dockerfile, apenas a última terá efeito.

formato:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

O segundo formato é recomendado e o processo de execução é relativamente claro. O primeiro formato será convertido automaticamente para o segundo formato durante a operação e o arquivo executável padrão é sh.

PONTO DE ENTRADA

Semelhante ao comando CMD, mas não será sobrescrito pelo comando especificado pelo parâmetro da linha de comando docker run e esses parâmetros da linha de comando serão usados ​​como parâmetros para o programa especificado pelo comando ENTRYPOINT.

No entanto, se a opção --entrypoint for usada durante a execução do docker, o parâmetro dessa opção pode ser usado como o programa a ser executado para substituir o programa especificado pela instrução ENTRYPOINT.

Vantagens: Ao executar a execução do docker, você pode especificar os parâmetros necessários para a operação ENTRYPOINT.

Nota: Se houver várias instruções ENTRYPOINT no Dockerfile, apenas a última terá efeito.

formato:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

Pode ser usado com o comando CMD: Geralmente, CMD é usado somente quando os parâmetros são alterados.O CMD aqui é equivalente a passar parâmetros para ENTRYPOINT, que serão mencionados nos exemplos a seguir.

Exemplo:

Supondo que a imagem nginx: test tenha sido criada por meio do Dockerfile:

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

1. Executar sem transferência de parâmetro

$ docker run  nginx:test

O seguinte comando será executado no contêiner por padrão para iniciar o processo principal.

nginx -c /etc/nginx/nginx.conf

2. Operação de transferência de parâmetros

$ docker run  nginx:test -c /etc/nginx/new.conf

O seguinte comando será executado no contêiner por padrão para iniciar o processo principal (/etc/nginx/new.conf: assumindo que este arquivo já existe no contêiner)

nginx -c /etc/nginx/new.conf
ENV

Defina a variável de ambiente, defina a variável de ambiente e, nas instruções subsequentes, você pode usar esta variável de ambiente.

formato:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

O exemplo a seguir define NODE_VERSION = 7.2.0, que pode ser referenciado por $ NODE_VERSION nas instruções subsequentes:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG

Os parâmetros de construção são iguais aos do ENV. Mas o escopo é diferente. A variável de ambiente definida por ARG só é válida no Dockerfile, o que significa que só é válida durante o processo de construção do docker. Essa variável de ambiente não existe na imagem construída.

A compilação docker do comando build pode ser substituída por --build-arg <nome do parâmetro> = <valor>.

formato:

ARG <参数名>[=<默认值>]
VOLUME

Defina um volume de dados anônimos. Se você se esquecer de montar o volume de dados ao iniciar o contêiner, ele será montado automaticamente no volume anônimo.

efeito:

Evite perder dados importantes devido à reinicialização do contêiner, que é muito fatal.
Evite recipientes que ficam cada vez maiores.
formato:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

Ao iniciar a execução da docker de contêiner, podemos modificar o ponto de montagem por meio do parâmetro -v.

EXPOR

Basta declarar a porta.

efeito:

Ajude os usuários do espelho a entender a porta de proteção desse serviço de espelhamento para facilitar a configuração do mapeamento.
Ao usar o mapeamento de porta aleatório no tempo de execução, ou seja, quando o docker executa -P, a porta EXPOSE será mapeada automaticamente de forma aleatória.
formato:

EXPOSE <端口1> [<端口2>...]
WORKDIR

Especifique o diretório de trabalho. O diretório de trabalho especificado por WORKDIR existirá em todas as camadas da imagem. (O diretório de trabalho especificado por WORKDIR deve ser criado com antecedência).

No processo de construção docker da imagem, cada comando RUN é uma nova camada. Apenas os diretórios criados por meio do WORKDIR sempre existirão.

formato:

WORKDIR <工作目录路径>
DO UTILIZADOR

É usado para especificar o usuário e o grupo de usuários que executa os comandos subsequentes, apenas para alternar o usuário que executa os comandos subsequentes (o usuário e o grupo de usuários já devem existir previamente).

formato:

USER <用户名>[:<用户组>]
EXAME DE SAÚDE

Usado para especificar um programa ou instrução para monitorar o status de execução do serviço do docker container.

formato:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
ONBUILD

Usado para atrasar a execução de comandos de construção. Simplificando, o comando especificado com ONBUILD no Dockerfile não será executado durante o processo de construção da imagem (supondo que a imagem seja uma construção de teste). Quando um novo Dockerfile usa a imagem construída anteriormente FROM test-build, que é para executar a construção Dockerfile da nova imagem, o comando especificado por ONBUILD no Dockerfile de test-build será executado.

formato:

ONBUILD <其它指令>

Acho que você gosta

Origin blog.csdn.net/BigData_Mining/article/details/108315777
Recomendado
Clasificación