>  기사  >  운영 및 유지보수  >  DockerFile 명령을 심층적으로 이해하도록 안내합니다.

DockerFile 명령을 심층적으로 이해하도록 안내합니다.

WBOY
WBOY앞으로
2022-02-22 17:40:252122검색

이 문서는 dockerFile 명령에 대한 관련 지식을 제공합니다. 이 명령에는 지침이 포함되어 있습니다. 각 지침은 모든 사람에게 도움이 되기를 바랍니다.

DockerFile 명령을 심층적으로 이해하도록 안내합니다.

추천 학습: "docker video tutorial"

DockerFile 명령에 대한 자세한 설명

Dockerfile은 각각 레이어를 구성하는 지침이 포함된 이미지 제작 파일입니다.

이미지 빌드

docker build [选项] <上下文路径/URL/->

docker build -t nginx:v3 .           # . 表示Dockerfile在当前目录

FROM은 기본 이미지를 지정합니다

FROM을 통해 기본 이미지를 지정합니다. 따라서 FROM은 Dockerfile에서 필수 명령어이며 첫 번째 명령어여야 합니다.

처음부터 이 이미지는 가상의 개념이며 실제로 존재하지 않습니다. 다음 지침은 이미지의 첫 번째 레이어로 존재하기 시작합니다.

RUN 실행 명령

RUN은 명령줄 명령을 실행하는 데 사용됩니다. 두 가지 형식이 있습니다.

쉘 형식:

RUN <命令>

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exec 형식:

RUN ["可执行文件", "参数1", "参数2"]

Union FS에는 AUFS와 같은 최대 레이어 수가 있습니다. 이전에는 최대 레이어 수는 42개였지만 현재는 127개입니다. 동일한 기능의 경우 &&를 사용하여 필요한 명령을 연결하여 미러 레이어 수를 단순화해야 합니다.

COPY 파일 복사

COPY [--chown=<user>:<group>] <宿主机源路径> <镜像内的目标路径>
COPY [--chown=<user>:<group>] ["<宿主机源路径1>",... "<镜像内的目标路径>"]
# 把当前目录的a.txt文件复制到镜像的根目录
COPY a.txt /a.txt

ADD 복사 파일(파일 다운로드 또는 파일 압축 풀기)

ADD [--chown=<user>:<group>] http://xxx <目标路径>       # 下载文件到镜像的目标路径
ADD [--chown=<user>:<group>] ./a.tar.gz <目标路径>       # 复制压缩包,并自动解压到目标路径

CMD는 컨테이너 메인 프로세스의 기본 시작 명령을 지정합니다

CMD ["可执行文件", "参数1", "参数2"...]
# 指定进入容器马上指定 cat /a.txt

CMD ["sh","-c", "cat /a.txt"]

docker run -it 이미지 실행 시 /bin/bash와 같은 명령을 지정하지 않으면 , sh -c cat /a .txt가 자동으로 실행됩니다. 그렇지 않으면 컨테이너의 기본 프로세스의 시작 명령이 사용자가 지정한 CMD

ENTRYPOINT에 따라 지정됩니다. CMD

형식은 일관됩니다. CMD의 차이점

1. ENTRYPOINT를 사용하여 매개변수 전달

명령줄이 docker를 전달할 때 Dockerfile [ "curl", "-s", "http://myip.ipip.net" ]에 ENTRYPOINT를 지정하세요. myip -i를 실행하면 -i 매개변수가 ENTRYPOINT 명령에 전달되고, 마지막으로
컨테이너에 들어가면 컨테이너가 컬 -s http://myip.ipip.net -i

2를 실행합니다. CMD와 관련이 없는 일부 초기화 작업. 컨테이너의 CMD가 무엇이든 상관없이 사전 처리 작업이 필요합니다.

ENTRYPOINT ["docker-entrypoint.sh"]와 유사 이 스크립트는 사용자의 신원이 합법적인지 등을 확인합니다.

ENV는 환경 변수를 설정합니다.

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

ARG 빌드 매개변수

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

ARG 명령에는 유효한 범위, FROM 명령어 앞에 지정된 경우 FROM 명령어에서만 사용할 수 있습니다.

ARG DOCKER_USERNAME=library

FROM ${DOCKER_USERNAME}/alpine

FROM 이후에 지정하는 경우 각 단계에서 사용되는 변수는 각 단계에서 별도로 지정해야 합니다

FROM ${DOCKER_USERNAME}/alpine

# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library

RUN set -x ; echo ${DOCKER_USERNAME}

VOLUME 익명 볼륨

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

사용자가 런타임 중에 동적 파일이 저장되는 디렉터리를 마운트하는 것을 잊어버리지 않도록 볼륨으로서 Dockerfile에서 특정 디렉토리를 익명 볼륨으로 마운트하도록 미리 지정할 수 있으므로, 사용자가 런타임 시 마운트를 지정하지 않으면 컨테이너 스토리지에 많은 양의 데이터를 쓰지 않고도 애플리케이션이 정상적으로 실행될 수 있습니다. layer

여기서 /data 디렉토리는 컨테이너가 실행 중일 때 자동으로 익명 볼륨으로 마운트됩니다. /data에 기록된 모든 정보는 컨테이너 스토리지 계층에 기록되지 않으므로 컨테이너 스토리지 계층의 상태 비저장이 보장됩니다.

EXPOSE 노출된 포트

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

EXPOSE 명령은 컨테이너가 실행될 때 서비스를 제공하는 포트를 선언합니다. EXPOSE는 컨테이너가 사용할 포트만 선언하고 호스트에서 포트 매핑을 자동으로 수행하지 않습니다.

Dockerfile에 이러한 문을 작성하면 두 가지 이점이 있습니다. 하나는 이미지 사용자가 이미지 서비스의 보호 포트를 이해하여 구성 매핑을 용이하게 하는 것입니다.

다른 하나는 런타임에 임의 포트 매핑을 사용할 때입니다. , docker가 -P를 실행하면 EXPOSE 포트가 자동으로 무작위로 매핑됩니다.

EXPOSE와 런타임 시 -p : 사용을 구별하세요.

-p는 호스트 포트와 컨테이너 포트를 매핑합니다. 즉, 컨테이너의 해당 포트 서비스를 외부 세계에 노출합니다.

WORKDIR은 작업 디렉터리를 지정합니다. 디렉터리가 없으면 WORKDIR은 디렉터리를 생성합니다

WORKDIR <工作目录路径>

예 1:

WORKDIR /app

RUN echo "hello" > world.txt

예 2:

WORKDIR /a
WORKDIR b
WORKDIR c

RUN pwd

## RUN pwd 的工作目录为 /a/b/c

USER 현재 사용자를 지정합니다

USER <用户名>[:<用户组>]

실행 중에 ID를 변경하려는 경우, 예를 들어 이미 설정된 사용자로 서비스 프로세스를 실행하려는 경우 su 또는 sudo를 사용하지 마십시오. 이러한 구성은 더 번거롭고 오류가 자주 발생합니다. TTY가 누락된 환경. 고수를 사용하는 것이 좋습니다.

# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis

# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
    
# 设置 CMD,并切换到redis用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]

HEALTHCHECK는 Docker에게 컨테이너 상태가 정상인지 확인하는 방법을 알려줍니다.

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

옵션:

--interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次

HEALTHCHECK 명령이 이미지에 지정되면 이를 사용하여 컨테이너를 시작합니다. 시작하고 HEALTHCHECK 명령 확인이 성공하면 건강 상태가 됩니다. 연속으로 특정 횟수만큼 실패하면 비정상 상태가 됩니다.

HEALTHCHECK는 한 번만 나타날 수 있습니다. 여러 개를 쓰면 마지막 항목만 적용됩니다

CMD 命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败

ONBUILD 指定某些命令只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行

ONBUILD <其它指令>
# 举例如下Dockerfile,初次构建为镜像my-node时,ONBUILD的三行命令不会执行

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

# 只要当其他镜像 FROM my-node 从上面镜像作为基础镜像进行构建时,ONBUILD 的命令开始执行

LABEL 为镜像添加元数据

LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 标注镜像的作者

LABEL org.opencontainers.image.authors="yeasy"

SHELL 指定执行shell命令的参数

SHELL ["可执行程序", "参数"]
SHELL ["/bin/sh", "-c"]

RUN lll ; ls             # 这里的shell命令将通过 /bin/sh -c 的方式执行

推荐学习:《docker视频教程

위 내용은 DockerFile 명령을 심층적으로 이해하도록 안내합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제