docker-dev 镜像生成 踩过得坑

本文详细介绍如何搭建Docker的编译环境,包括所需软件版本要求、创建编译环境的具体步骤及过程中的常见问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、环境要求

a GitHub account
git
make
docker

1、git 版本 大于 2.2.2

vito@caas:~$ git --version
git version 2.7.4

2、make版本 大于3.8.1

vito@caas:~$ make -v
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

3、docker 版本

vito@caas:~$ sudo docker --version
Docker version 17.09.0-ce, build afdb6d4

linux 用户小提示:
如果你的用户没有加入docker组,每次执行docker命令笔记加上sudo,执行下面的命令查看是否加入docker组,下面的命令表示没有加入。所以执行命令的时候必须加入sudo:

vito@caas:~$ getent group docker
docker:x:999:
vito@caas:~$ sudo docker --version
Docker version 17.09.0-ce, build afdb6d4

我们可以执行以下命令把当前用户加入到docker组:
(注意:执行命令后重新启动)

vito@caas:~$ sudo usermod -aG docker username

2、创建docker编译环境

git clone https://github.com/docker/distribution.git
  • 切换到源码根目录,发现根目录有一个Dockerfile,用这个Dockerfile创建docker的编译环境,执行创建docker

    镜像的命令:

vito@caas:~/docker/moby$ sudo make BIND_DIR=. shell
Makefile:115: The docker client CLI has moved to github.com/docker/cli. For a dev-test cycle involving the CLI, run:
 DOCKER_CLI_PATH=/host/path/to/cli/binary make shell 
 then change the cli and compile into a binary at the same location.

docker build   -t "docker-dev:master" -f "" .
Sending build context to Docker daemon  38.42MB
Step 1/39 : FROM debian:stretch
 ---> 874e27b628fd
Step 2/39 : ARG APT_MIRROR=deb.debian.org
 ---> Using cache
 ---> 2189fccf5c85
Step 3/39 : RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list
 ---> Using cache
 ---> 183f018c0759
Step 4/39 : RUN apt-get update && apt-get install -y    apparmor    apt-utils   aufs-tools  automake    bash-completion     binutils-mingw-w64  bsdmainutils    btrfs-tools     build-essential     cmake   createrepo  curl    dpkg-sig    gcc-mingw-w64   git     iptables    jq  less    libapparmor-dev     libcap-dev  libdevmapper-dev    libnl-3-dev     libprotobuf-c0-dev  libprotobuf-dev     libseccomp-dev  libsystemd-dev  libtool     libudev-dev     mercurial   net-tools   pkg-config  protobuf-compiler   protobuf-c-compiler     python-backports.ssl-match-hostname     python-dev  python-mock     python-pip  python-requests     python-setuptools   python-websocket    python-wheel    tar     thin-provisioning-tools     vim     vim-common  xfsprogs    zip     --no-install-recommends     && pip install awscli==1.10.15
 ---> Using cache
 ---> 65e6b480b2aa
Step 5/39 : ENV GO_VERSION 1.8.4
 ---> Using cache
 ---> fd97af8ee1ba
Step 6/39 : RUN curl -fsSL "https://studygolang.com/dl/golang/go${GO_VERSION}.linux-amd64.tar.gz"  | tar -xzC /usr/local
 ---> Running in e405bfebb65e

踩过的坑

这里写图片描述

  • 再次执行 :sudo make BIND_DIR=. shell,执行到第30步的时候报错:
Step 30/39 : RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images    buildpack-deps:jessie@sha256:85b379ec16065e4fe4127eb1c5fb1bcc03c559bd36dbb2e22ff496de55925fa6   busybox:latest@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f  debian:jessie@sha256:72f784399fd2719b4cb4e16ef8e369a39dc67f53d978cd3e2e7bf4e502c7b793   hello-world:latest@sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
 ---> Running in 73210ada3c34
/usr/bin/env: 'bash1\r': No such file or directory
The command '/bin/sh -c ./contrib/download-frozen-image-v2.sh /docker-frozen-images     buildpack-deps:jessie@sha256:85b379ec16065e4fe4127eb1c5fb1bcc03c559bd36dbb2e22ff496de55925fa6   busybox:latest@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f  debian:jessie@sha256:72f784399fd2719b4cb4e16ef8e369a39dc67f53d978cd3e2e7bf4e502c7b793   hello-world:latest@sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7' returned a non-zero code: 127
Makefile:115: recipe for target 'build' failed
make: *** [build] Error 127

经过分析是因为脚本中存在windows的换行符,使用命令替换掉换行符:

sed -i 's/\r$//' contrib/download-frozen-image-v2.sh

会把 .sh 中的\r 替换成空白,再次编译,pass

  • 执行过程中,如果发现脚本中用到的有些文件夹不存在,可能是因为权限不够,造成创建的某些文件夹失败,解决方案是切换到root用户下执行:make BIND_DIR=. shell
  • 镜像下载慢问题:由于sh脚本中定义的镜像仓库都是国外的仓库,下载镜像比较慢,甚至终端,可以把镜像仓库替换为国内的镜像仓库,例如:download-frozen-image-v2.sh文件中的registryBase
registryBase='https://registry-1.docker.io'
authBase='https://auth.docker.io'
authService='registry.docker.io'

替换为:
registryBase='https://5162s31v.mirror.aliyuncs.com'
authBase='https://auth.docker.io'
authService='registry.docker.io'

第33步错误:

Step 33/39 : RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy dockercli gometalinter
 ---> Running in 8f981ec52383
++ dirname /tmp/install-binaries.sh
+ . /tmp/binaries-commits
++ $'\r'
/tmp/binaries-commits: line 2: $'\r': command not found
The command '/bin/sh -c /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy dockercli gometalinter' returned a non-zero code: 127
Makefile:115: recipe for target 'build' failed
make: *** [build] Error 127

解决办法1,修改/hack/dockerfile/install-binaries.sh文件

    url=https://download.docker.com/linux/static
    curl -Ls $url/$DOCKERCLI_CHANNEL/$arch/docker-$DOCKERCLI_VERSION.tgz | \
    tar -xz docker/docker
    mv docker/docker /usr/local/bin/
    rmdir docker
改为:
    url=https://download.docker.com/linux/static
    curl -o docker-$DOCKERCLI_VERSION.tgz $url/$DOCKERCLI_CHANNEL/$arch/docker-$DOCKERCLI_VERSION.tgz | \
    tar -xzf docker-$DOCKERCLI_VERSION.tgz
    mv docker/docker /usr/local/bin/
    rmdir docker

上马的方法如该不行,有个稍微麻烦的办法,自己下载docker-17.06.0-ce.tgz文件:https://download.docker.com/linux/static/edge/x86_64/docker-17.06.0-ce.tgz,解压缩,然后放在自己的github上,在github上自己的账户下创建public项目docker,把解压缩的文件上传到githua中。然后修改里面的语句为git clone,具体修改后内容如下:

        url=https://download.docker.com/linux/static
        git clone https://github.com/liujb0319/docker.git
        mv docker/docker /usr/local/bin/
        rm -rf docker
<think>嗯,用户想让我解释一个名为dev_in_docker.sh的bash脚本,里面用到了Docker构建镜像和启动容器的命令。首先,我需要回忆一下Docker的基本命令,比如docker build、docker-compose up这些,然后结合用户提供的参考引用中的Dockerfile内容来分析可能的脚本结构。 用户提到的参考引用[^1]里有一个Dockerfile的例子,里面用了openjdk:8作为基础镜像,设置了工作目录,复制jar文件,设置时区,还有ENTRYPOINT启动Java应用。可能这个脚本会涉及到构建这个镜像,然后用docker-compose来启动服务。 接下来,用户的问题是关于解释脚本的具体功能和每一行的作用。我需要假设一个典型的dev_in_docker.sh脚本的结构,可能包括构建镜像、停止旧容器、删除旧容器、启动新容器等步骤。然后逐行解释每个命令的作用,比如docker-compose down是停止并删除容器,docker build构建镜像docker-compose up启动服务等。 同时,用户要求使用中文回答,行内数学表达式用$...$,但在这个问题中可能用不上数学公式,但要注意格式要求。另外需要生成相关问题,可能需要考虑Docker常见命令、优化构建、多阶段构建、环境变量管理等问题。 还要注意用户之前的问题可能涉及Dockerfile和docker-compose的使用,所以需要保持回答的连贯性,结合之前的引用内容。比如,引用中的Dockerfile暴露了端口8081,所以在脚本中可能会有端口映射的部分。 最后,确保回答结构清晰,分步骤解释脚本的每个部分,可能包括代码块和注释,然后列出相关问题。检查是否有遗漏的命令解释,确保用户能理解每行脚本的功能和整体流程。</think>### 解释 `dev_in_docker.sh` 脚本功能及逐行作用 以下是典型包含Docker构建和启动流程的Bash脚本解析框架,结合Dockerfile和docker-compose实现开发环境容器化部署: ```bash #!/bin/bash # 停止并删除旧容器 docker-compose down # 清理旧镜像(可选) docker rmi gateway:latest 2>/dev/null # 构建新镜像 docker build -t gateway:latest -f Dockerfile.gateway . # 启动容器集群 docker-compose up -d --force-recreate ``` #### 逐行功能解析 1. **`docker-compose down`** 停止与当前docker-compose.yml关联的所有容器,并删除网络和容器资源[^1]。保证后续启动时环境干净 2. **`docker rmi gateway:latest 2>/dev/null`** 强制删除旧的网关镜像- `2>/dev/null` 屏蔽错误输出(若镜像不存在时不报错) - 适用于需要完全重建镜像的场景 3. **`docker build -t gateway:latest -f Dockerfile.gateway .`** 构建新镜像的核心命令: - `-t` 指定镜像名称和标签 - `-f` 指定Dockerfile路径(非默认名称时使用) - `.` 表示构建上下文为当前目录 4. **`docker-compose up -d --force-recreate`** 后台启动容器集群: - `-d` 守护进程模式运行 - `--force-recreate` 强制重新创建容器(即使配置未变更) - 自动加载docker-compose.yml中定义的服务配置 #### 配套Dockerfile关键点(引用[^1]) ```Dockerfile FROM openjdk:8 ENTRYPOINT ["java","-jar","app.jar"] ``` - 基础镜像选择直接影响运行时环境 - ENTRYPOINT定义容器启动时固定执行的Java命令 - 分层构建优化体现在`.jar`文件单独复制层
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值