我正在try 停靠我的Scala应用程序--在其中我使用Scalapy运行了Python代码.我的Scala版本(2.13.1)、SBT版本(1.2.8).
Main Class in Scala:个
import me.shadaj.scalapy.interpreter.CPythonInterpreter
import me.shadaj.scalapy.py
object Main extends App {
val pythonCode =
"""
|import os
|
|myFile = os.path.join("src", "main", "resources", "myFile.txt")
|
|with open(myFile, "w") as file:
| file.write("Hello World!")
|""".stripMargin
py.local {
CPythonInterpreter.execManyLines(pythonCode)
}
}
我在project/plugins.sbt中添加了一个LibraryDependency:
libraryDependencies += "ai.kien" %% "python-native-libs" % "0.2.2"
这是我的建筑.
import com.typesafe.sbt.packager.docker.{DockerChmodType, DockerPermissionStrategy, ExecCmd}
import ai.kien.python.Python
lazy val root = (project in file("."))
.settings(
name := "my-project"
)
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := "2.13.1"
ThisBuild / scapegoatVersion := "1.4.0"
enablePlugins(JavaAppPackaging, DockerPlugin)
packageName in Docker:= "my-project"
version in Docker:= "0.0.3"
dockerExposedPorts:= Seq(8083)
dockerChmodType := DockerChmodType.UserGroupWriteExecute
dockerPermissionStrategy := DockerPermissionStrategy.CopyChown
dockerAdditionalPermissions += (DockerChmodType.UserGroupPlusExecute, "/var/run/")
daemonUserUid in Docker := None
daemonUser in Docker := "root"
dockerCommands ++= Seq(
ExecCmd("RUN", "apt-get", "update"),
ExecCmd("RUN", "apt-get", "install", "-y", "python3")
)
fork:= true
lazy val python = Python("/usr/bin/python3")
lazy val javaOpts = python.scalapyProperties.get.map {
case (k, v) => s"""-D$k=$v"""
}.toSeq
javaOptions ++= javaOpts
libraryDependencies ++= Seq(
"me.shadaj" %% "scalapy-core" % "0.5.2"
)
现在,如果我用SBT-SHELL在IntelliJ IDEA中运行它,程序运行得很好-但如果我用Run按钮运行,它会给出:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'python3':
libpython3.so: cannot open shared object file: No such file or directory
libpython3.so: cannot open shared object file: No such file or directory
Native library (linux-x86-64/libpython3.so) not found in resource path (/home/zaryab/IdeaProjects/My_Project/target/scala-2.13/classes:/home/zaryab/.ivy2/cache/aopalliance/aopalliance/jars/aopalliance-1.0.jar)
在这一点上,它很好,因为它与SBT-Shell一起工作.但现在我想把它对接起来.为此,我在Build.sbt中添加了一些Docker命令--并且我正在使用sbt-ative-Packager制作我的应用程序映像.
由SBT-Native-Packager自动创建的DockerFile:
FROM openjdk:8
WORKDIR /opt/docker
COPY --chown=root:root opt /opt
EXPOSE 8083
USER root
ENTRYPOINT ["/opt/docker/bin/notary-scraping"]
CMD []
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "python3"]
但当我运行此图像的容器时,它给出的错误与我使用运行按钮运行时得到的错误相同.
我已经运行了不同的命令来判断‘python3’是否在容器中:
First I run 'docker exec -it my_container /bin/bash'
Then 'which python3' - it prints '/usr/bin/python3'
Python3在容器中,但仍为‘unable to load python3’.我现在应该怎么做才能正确地将它停靠在 docker 上?