이 문서는 dockerFile 명령에 대한 관련 지식을 제공합니다. 이 명령에는 지침이 포함되어 있습니다. 각 지침은 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: "docker video tutorial"
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!