docker 镜像来构建另一个镜像

时间:2021-01-18 06:55:39

标签: java docker docker-compose amazon-dynamodb amazon-dynamodb-local

嗨,我需要对系统进行 dockerize。我必须这样做的方式如下

步骤:

  1. up dynamodb 本地实例(仅用于 up)。
  2. 运行自定义脚本来创建表(必须通过这个来创建表)。
  3. 然后运行系统。

我也写了一个撰写文件。我这样做的方式是,如下所示

version: "3"

services:
    dynamodb:
        image: amazon/dynamodb-local
        ports:
            - "8000:8000"
        networks:
            - custom-network
        volumes:
            - "db-data:/home/dynamodblocal/data"

    app:
        container_name: my-app
        build:
            context: .
            dockerfile: Dockerfile
            args:
                AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
                AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
                URL: ${URL}

        env_file:
            - docker.env
        depends_on:
            - dynamodb
        networks:
            - custom-network

volumes:
    db-data:

networks:
    custom-network:

docker 文件如下。 (抱歉不得不隐藏敏感细节)

FROM debian:buster

ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG URL
RUN echo "deb http://ftp.us.debian.org/debian sid main" >> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install openjdk-8-jdk maven awscli -y
RUN aws s3 cp ${URL} db-updater.jar

RUN echo local > input
# there are few lines of configs that wrote to input file

RUN cat input | java -jar db-updater.jar http://dynamodb:8000
WORKDIR /opt/app
COPY . .
RUN mvn package
EXPOSE 8080

CMD ["java","-cp","./app/target/app-1.0.0.jar:./app/target/lib/*"]

我的问题是 dynamodb 在脚本运行之前没有启动。所以脚本抛出一个错误,因为无法连接到服务器。 如果我可以编写一个带有执行脚本的自定义 dynamodb,那也很棒。请帮忙

1 个答案:

答案 0 :(得分:0)

Dockerfile 中的命令永远不能与其他 Docker 容器交互。一般的模式是,映像构建一次并重复使用,因此您可以删除并重新创建 DynamoDB 容器,或者在不同的系统上运行相同的映像,而不会发生数据库设置。从机制上讲,Dockerfile 在未连接到 Compose 网络系统的环境中运行,因此尝试在容器之间进行连接通常会失败,并显示“没有这样的主机”错误。

典型的模式是使用入口点脚本在容器启动时进行首次设置。例如,您可以编写一个简单的 shell 脚本:

#!/bin/sh

# Seed the database
java -jar db-updater.jar http://dynamodb:8000 < input

# Run whatever the main container command is
exec "$@"

然后您可以将其包含在您的 Dockerfile 中:

COPY entrypoint.sh .  # probably included in the `COPY . .` line
ENTRYPOINT ["./entrypoint.sh"]  # must be JSON-array syntax
                                # replaces `RUN java -jar db-updater.jar`
CMD ["java", "-cp", ...]        # as in the current Dockerfile

如果您在第一次设置容器堆栈时只需要运行一次,您还可以在主机上播种数据。

# Outside Docker
aws s3 cp ... db-updater.jar
./make-seed-data.sh > input

# Start the DynamoDB container (only)
docker-compose up -d dynamodb

# Load the seed data
java -jar db-updater.jar -url http://localhost:8000 < input

# Now start the rest of the application
docker-compose up -d

这将允许您删除构建输入文件的代码并从您的 Dockerfile 下载更新程序工具。它还可以让您从构建序列中删除 AWS 凭证(非常重要:可能可以通过查看图像的 docker history 以纯文本形式找到它们)。