docker image构建另一个镜像



嗨,我需要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与执行脚本,这也是伟大的。请帮助

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

典型的模式是在容器启动时使用入口点脚本进行首次设置。例如,您可以编写一个简单的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的纯文本中找到它们)。