【问题标题】:How can I create DockerFile from docker-compose file如何从 docker-compose 文件创建 DockerFile
【发布时间】:2020-05-11 10:10:33
【问题描述】:

我有一个现有的 docker-compose 文件

version: '3.6'
services:

  verdaccio:
    restart: always
    image: verdaccio/verdaccio
    container_name: verdaccio
    ports:
      - 4873:4873
    volumes:
      - conf:/verdaccio/conf
      - storage:/verdaccio/storage
      - plugins:/verdaccio/plugins
    environment:
      - VERDACCIO_PROTOCOL=https

networks:
    default:
        external:
            name: registry

我想使用 DockerFile 而不是 docker-compose,因为在 Azure 容器注册表上部署 DockerFile 会更容易。

我尝试了许多在博客和其他网站上发布的解决方案,但都没有达到我需要的效果。

如何从上述 docker-compose 文件创建简单的 DockerFile?

【问题讨论】:

  • Dockerfile != docker compose.两种不同的东西。

标签: docker docker-compose dockerfile azure-container-registry verdaccio


【解决方案1】:

你不能。许多 Docker Compose 选项(以及等效的 docker run 选项)只能在启动容器时设置。在您的示例中,重启策略、发布的端口、已安装的卷、网络配置和覆盖容器名称都是运行时选项。

如果您构建了与此匹配的 Docker 映像,您最多可以添加一个 ENV 变量和 COPYing 在配置文件和插件中,而不是将它们存储在命名卷中。 docker-compose.yml 中的大部分仍然是必需的。

【讨论】:

    【解决方案2】:

    如果您想将conf、storage 和plugins 文件/文件夹放入图像中,您只需复制它们即可:

    FROM verdaccio/verdaccio
    WORKDIR /verdaccio
    COPY conf conf
    COPY storage storage
    COPY plugins plugins
    

    但如果您需要保留文件/和文件夹更改,那么您应该保持它们现在的样子。

    【讨论】:

      【解决方案3】:

      docker-compose 使用现有图像。

      如果您想要创建一个自定义图像并将其与您的 docker-compose 设置一起使用,这是完全可能的。

      1. 创建您的Dockerfile - 例如:https://docs.docker.com/get-started/part2/
      2. 从你的 Dockerfile 构建一个“镜像”:docker build -f /path/to/Dockerfile -t saurabh_rai/myapp:1.0 这会返回一个类似12abef12 的镜像 ID
      3. 登录到您的 dockerhub 帐户 (saurabh_rai) 并为要推送到的图像创建一个 repo (myapp)
      4. docker push saurabh_rai/myapp:1.0 - 将您的图像推送到 hub.docker.com 存储库,供您的用户到 myapp 存储库。您可能需要执行 docker login 才能使其正常工作,并像往常一样在命令行中输入您的用户名/密码。
      5. 更新您的docker-compose.yaml 文件以使用您的图像saurabh_rai/myapp:1.0

      例如docker-compose.yaml:

      version: '3.6'
      services:
      
        verdaccio:
          restart: always
          container_name: verdaccio
          image: saurabh_rai/myapp:1.0
          ports:
            - 4873:4873
          volumes:
            - conf:/verdaccio/conf
            - storage:/verdaccio/storage
            - plugins:/verdaccio/plugins
          environment:
            - VERDACCIO_PROTOCOL=https
          network:
            - registry
      

      【讨论】:

      • 实际上我有一个使用 docker compose 文件并已部署在虚拟机上的现有项目,现在我需要将整个代码库迁移到 Azure 应用服务,这就是为什么我需要将其转换为DockerFile 等方式的代码库的历史记录必须相同。由于 Azure 仍然完全不支持撰写文件部署。我只有 DockerFile 选项
      • 答案在于 dockerfile、图像和容器之间的区别。 docker-compose 文件更像是一个配置文件,它可以让你创建一个或多个具有不同依赖项和设置的容器。无论是重启策略还是端口,它们都只有在容器的情况下才会出现。但是,您可以通过在 dockerfile 中使用一些基础镜像来创建自定义镜像。
      • 你并没有真正在 docker-compose 工作 -> Dockerfile。通常我们会生成一个Dockerfile -> 构建映像 -> 在docker-compose.yaml 中使用映像,并在运行时提供配置,以便可以在开发、测试或生产中配置和运行单个映像。既然你问了,你可以创建一个图像,但它变得不那么可重用了。例如,您正在安装发生变化的卷。如果您对内容是静态的感到满意,您可以使用Dockerfile 中的COPY src/ dest/ 将目录的内容复制到您的映像中。对环境变量等做同样的事情。
      【解决方案4】:

      我已经通过使用下面给出的现有 verdaccio DockerFile 解决了这个问题。

      FROM node:12.16.2-alpine as builder
      
      ENV NODE_ENV=production \
          VERDACCIO_BUILD_REGISTRY=https://registry.verdaccio.org
      
      RUN apk --no-cache add openssl ca-certificates wget && \
          apk --no-cache add g++ gcc libgcc libstdc++ linux-headers make python && \
          wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
          wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-2.25-r0.apk && \
          apk add glibc-2.25-r0.apk
      
      WORKDIR /opt/verdaccio-build
      COPY . .
      
      RUN yarn config set registry $VERDACCIO_BUILD_REGISTRY && \
          yarn install --production=false && \
          yarn lint && \
          yarn code:docker-build && \
          yarn cache clean && \
          yarn install --production=true
      
      
      
      FROM node:12.16.2-alpine
      LABEL maintainer="https://github.com/verdaccio/verdaccio"
      
      ENV VERDACCIO_APPDIR=/opt/verdaccio \
          VERDACCIO_USER_NAME=verdaccio \
          VERDACCIO_USER_UID=10001 \
          VERDACCIO_PORT=4873 \
          VERDACCIO_PROTOCOL=http
      ENV PATH=$VERDACCIO_APPDIR/docker-bin:$PATH \
          HOME=$VERDACCIO_APPDIR
      
      WORKDIR $VERDACCIO_APPDIR
      
      RUN apk --no-cache add openssl dumb-init
      
      RUN mkdir -p /verdaccio/storage /verdaccio/plugins /verdaccio/conf
      
      COPY --from=builder /opt/verdaccio-build .
      
      ADD conf/docker.yaml /verdaccio/conf/config.yaml
      
      RUN adduser -u $VERDACCIO_USER_UID -S -D -h $VERDACCIO_APPDIR -g "$VERDACCIO_USER_NAME user" -s /sbin/nologin $VERDACCIO_USER_NAME && \
          chmod -R +x $VERDACCIO_APPDIR/bin $VERDACCIO_APPDIR/docker-bin && \
          chown -R $VERDACCIO_USER_UID:root /verdaccio/storage && \
          chmod -R g=u /verdaccio/storage /etc/passwd
      
      USER $VERDACCIO_USER_UID
      
      EXPOSE $VERDACCIO_PORT
      
      VOLUME /verdaccio/storage
      
      ENTRYPOINT ["uid_entrypoint"]
      
      CMD $VERDACCIO_APPDIR/bin/verdaccio --config /verdaccio/conf/config.yaml --listen $VERDACCIO_PROTOCOL://0.0.0.0:$VERDACCIO_PORT
      
      

      通过对 DockerFile 进行一些更改,我能够构建我的 docker 映像并将其推送到 azure 容器注册表并部署到应用服务。

      @Giga Kokaia、@Rob Evans、@Aman - 感谢您提出的建议,让我们更容易思考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-21
        • 2021-09-15
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多