嗨,我需要对系统进行 dockerize。我必须这样做的方式如下
步骤:
我也写了一个撰写文件。我这样做的方式是,如下所示
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,那也很棒。请帮忙
答案 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
以纯文本形式找到它们)。